看了一些关于CNN中常见卷积方法的介绍,简单做一些笔记,详细介绍可参考文末的链接。
深度可分离卷积(Depthwise separable convolution)
思想:先逐通道地(depthwise)对输入数据体空间域做卷积,再沿着通道方向做1*1卷积进行通道融合
好处:
- 将通道和空间区域进行解耦分离;
- 有效降低参数量(e.g 卷积权重参数k*k*Ci*Co->k*k*Ci+1*1*Ci*Co)
分组卷积(Croup convolution)
思想:将输入数据体沿通道维度分成多组,对每组分别进行卷积,然后再将各组卷积的输出连接(concatenate)起来
好处:
- 同样可有效降低参数量(e.g 卷积权重参数k*k*Ci*Co->k*k*Ci*Co/g 分成g组);
- 可在通道维度学习block-diagonal结构的稀疏性,使得网络中高相关的滤波器能够以一种更加结构化的方式被学习到,不容易过拟合,起到类似正则化的效果
扩张/空洞卷积(Dilated/Atrous convolution)
思想:将卷积核进行“扩张”(拉大间距产生空洞,产生的空洞weight以0值填充,有一个扩张率参数d,可理解成有效卷积点间的距离)
好处:在不增加卷积核参数量的前提下或者不进行下采样的条件下有效扩大感受野,在图像需要全局信息的问题中,能够很好的应用dilated conv
顺便提一下dilated conv感受野的计算方法,设dilated conv的原始kernel size为k,dilated rate为d,则对应的实际卷积核大小也即局部感受野为k+(k-1)*(d-1),如上图的感受野为3+2*1=5,至于多层堆叠的感受野计算,可参看我之前写的博客关于CNN中感受野的理解和计算方法或使用这里的感受野计算器。
转置卷积(Transposed convolution)
思想:
思考角度1:对正向卷积的输出(较小分辨率)向量化后(下图浅蓝色矩形)去与卷积转置矩阵(将卷积核进行重排列并堆叠得到的,其权重参数可学习)进行矩阵相乘再将结果reshape(较大分辨率)(具体可参考一文搞懂反卷积,转置卷积)
思考角度2:直接对输入张量进行合适的零填充(zero-padding)然后执行普通的卷积也可达到相同的效果,见下图。
好处:可实现参数可学习的上采样,常用于语义分割和图像生成(DCGAN)中。
下面贴一小段PyTorch的二维卷积和转置卷积的代码(注意转置卷积的结果和卷积前的结输入是不一样的,说明转置卷积并不是卷积的完全逆过程,只是恢复了卷积前的形状,个人猜测PyTorch中的转置卷积应该是通过乘以转置卷积矩阵实现的),另外一般深度学习框架的卷积API都含有可设置分组卷积和扩张卷积的参数,可方便地实现分组卷积和扩张卷积乃至深度可分离卷积(分组卷积的分组数设置成输入通道数再加1*1卷积)
参考资料: