Date: 2020/04/02
Author: CW
前言:
到了这年头,对于深度可分离卷积(depth-wise convolution)大家应该都很熟悉了,但最近冒出来个新家伙,看上去仿佛是深度可分离卷积的亲戚——混合深度可分离卷积(简称MixConv)。本文简要叙述下这种新型卷积的操作,同时附上CW基于 Pytorch 实现的源码与相应的解析(作者源码是基于 Tensorflow 实现的,对那玩意儿 CW 已经弃坑了...)。
另外,出于尊重,附上原作 paper 与代码实现。
原文paper:MixConv: Mixed Depthwise Convolutional Kernels.
原作代码:MixConv代码实现
Outline
i). 混合深度可分离卷积是怎样一种操作?
ii). 源码解析
混合深度可分离卷积是怎样一种操作?
深度可分离卷积在炼丹者们的世界中已经家喻户晓了,就是对张量的每个通道用不同的卷积核去进行卷积,以达到通道分离计算的效果。但是这些卷积核的大小是一样的,而混合深度可分离卷积比较骚气,就是在这些卷积核中混合了不同的核大小,比如对一些通道使用3x3的核,而另一些使用5x5的核,7x7的核等等。
MixConv具体来说,是将输入张量基于通道这个维度划分为多个组,然后对每个组应用不同大小的卷积核进行深度可分离卷积操作,这里相当于是二次分组(深度可分离卷积实质就是将每个通道单独划分为一组),最后再将这些操作结果在通道这个维度拼接起来形成输出。
于是,在这样的一次卷积操作中便能捕获不同分辨率的不同模式,不同组的感受野不同,最终拼接起来进行融合,感觉和多特征融合的思想为同一路子,发现最近诸如大感受野 mix 小感受野、浅层特征 mix 深层特征之类的操作非常火热。
另外,作者给出的代码实现大致如下,大家好好feel一feel。
MixConv Implementation源码解析
这部分解析的是自己基于 Pytorch 实现的源码,经过测试,可以正常work。
其实了解原理后,还是挺容易实现的,主要的工作量就是将张量“合适”地分组后与不同大小的核建立起对应关系,而深度可分离卷积在 Pytorch 中的实现就是将卷积中的组数(参数 group)设置为与通道数相等即可。
首先看看初始化参数,注释应该都解释明白了。需要说明下的是,所有不同大小的核的步长(stride)是一致的,参数 dilated 代表是否要用空洞卷积来模拟不同大小的核(空洞卷积可以在原核基础上经过膨胀变为不同大小的核),另外,还遵循了作者源码的实现,即这个参数仅在步长为1时才生效。
MixConv Initialization接着,预先计算出不同核大小和对应的空洞率(dilation)。
MixConv Initialization(图中“有”更正为“由”)这里解释下空洞率 d = (k - 1) // 2 是如何计算的。假如使用空洞卷积,由3x3大小的核膨胀后卷积核大小为 k,那么就有 (3 - 1) x (d - 1) + 3 = k,从而得到 d 的计算方式,相应地,要把 k 置为3。
剩下就是初始化不同大小的卷积核并与对应组的张量进行卷积操作了。
MixConv Operation实现方式多种多样,萝卜青菜各有所爱,就看各人偏好了,这个实现起来还是比较轻松的,作为工作间歇时的“放松运动”是不错的选择哈哈哈(我不会告诉你我在开小差~)。
网友评论