看了一些关于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)
思想:将卷积核进行“扩张”(拉大间距,新扩张的地方以0值填充)
好处:在不增加卷积核参数量的前提下有效扩大感受野
转置卷积(Transposed convolution)
思想:
思考角度1:对正向卷积的输出(较小分辨率)向量化后去乘以卷积转置矩阵(其权重参数可学习)再将结果reshape(较大分辨率)(具体可参考一文搞懂反卷积,转置卷积)
思考角度2:直接对输入张量进行合适的零填充(zero-padding)然后执行普通的卷积也可达到相同的效果,见下图。
好处:可实现参数可学习的上采样,常用于语义分割和图像生成(DCGAN)中。
下面贴一小段PyTorch的二维卷积和转置卷积的代码(注意转置卷积的结果和卷积前的结输入是不一样的,说明转置卷积并不是卷积的完全逆过程,只是恢复了卷积前的形状),另外一般深度学习框架的卷积API都含有可设置分组卷积和扩张卷积的参数,可方便地实现分组卷积和扩张卷积乃至深度可分离卷积(分组卷积的分组数设置成输入通道数再加1*1卷积)
参考资料: