CNN中的深度可分离卷积、组卷积、空洞卷积、可变性卷积

时间:2024-05-23 13:04:06

参考:
https://zhuanlan.zhihu.com/p/28749411
https://blog.****.net/Chaolei3/article/details/79374563

1 普通卷积

CNN中的普通卷积是三维卷积,每个卷积核的通道数和输入数据通道数相同,卷积核的个数为输出数据的通道数。具体的计算过程为在各通道进行卷积核和对应感受野输入数据的对应位置相乘再相加操作,得到一个输出值。N个不同的卷积核就得到了N个输出值,将这些值沿着深度方向concatenate,就得到了一个点的输出。沿着空间滑动卷积核,就得到了最终的卷积结果。

假设输入大小为HI×WI×CIH_I\times W_I \times C_I,输出为Ho×Wo×CoH_o \times W_o \times C_o,卷积核的空间大小为 w×ww \times w,那么实际的卷积过程中使用的是大小为w×w×CIw \times w \times C_I的卷积核,共CoC_o个,因此总的参数数量为:Co×CI×w×wC_o \times C_I \times w \times w
举个例子,假设有一个3×3大小的卷积层,其输入通道为16、输出通道为32,那么总的参数数量为 323316=160832*3*3*16=1608
CNN中的深度可分离卷积、组卷积、空洞卷积、可变性卷积

2 深度可分离卷积(Depthwise Conv)

深度可分离卷积把普通卷积分成了两个过程,第一个过程只在空间上进行卷积,第二个过程只关注通道数。
CNN中的深度可分离卷积、组卷积、空洞卷积、可变性卷积
还以上面的参数举例,假设有一个3×3大小的卷积层,其输入通道为16、输出通道为32,其计算过程分为两步:

  1. 使用16个不同的卷积核,每个卷积核在各输入数据的通道上应用3*3的卷积,总的参数数量为3316=1443 * 3 * 16 = 144,得到的输出具有16个通道;
  2. 因为要想得到32个输出通道,因此在第一步的输出上应用1*1的卷积,这里使用3维卷积,每个卷积核大小是11161 * 1 * 16,共32个卷积核,总的参数数量是321116=51232 * 1 * 1 * 16=512

经过上面两步,取得了和普通三维卷积同样的输出,但参数数量为 3316+321116=6563*3*16 + 32*1*1*16 = 656,相比于普通卷积大大减少了参数数量,有助于规避过拟合。

3 组卷积(Group Conv)

组卷积最早在AlexNet论文中出现(读论文的时候竟然没发现,汗颜),当时是因为硬件限制,没办法在单个显卡上完成大参数的卷积运算,所以切分到多个显卡上进行。但现在可以发现组卷积可以减少参数数量,因此目前也具有广泛的应用场景。

CNN中的深度可分离卷积、组卷积、空洞卷积、可变性卷积CNN中的深度可分离卷积、组卷积、空洞卷积、可变性卷积
这两幅图中,上图是普通的卷积,下图描述组卷积的操作。所谓的组卷积,就是沿着通道方向进行等分,每个卷积核和原始普通卷积核空间尺寸一致,但通道数为原来的1g\frac{1}{g},这样的卷积核也只和输入数据的1g\frac{1}{g}个通道进行卷积操作,卷积结果和原始普通卷积结果空间尺寸一致,但通道数为原始卷积的1g\frac{1}{g}。最终将g组卷积的结果按照通道方向进行concatenate操作,最终得到的输出大小和原始普通卷积是一样的。但参数数量由原来的c2h1w1c1c_2*h_1*w_1*c_1变成了gc2gh1w1c1g=1gc2h1w1c1g*\frac{c_2}{g}*h_1*w_1*\frac{c1}{g} = \frac{1}{g}*c_2*h_1*w_1*c_1.

4 空洞卷积(Dilated Conv)

空洞卷积也叫做扩张卷积,主要用在目标分割领域。标准的3×3卷积核只能看到对应区域3×3的大小,但是为了能让卷积核看到更大的范围,dilated conv使其成为了可能。空洞引入了一个称为 “扩张率(dilation rate)”的新参数,该参数定义了卷积核处理数据时各值的间距。换句话说,相比原来的标准卷积,扩张卷积多了一个dilation rate(扩张率)的超参数,指的是kernel各点之前的间隔数量,普通卷积的 dilatation rate为 1。

dilated conv原论文中的结构如图所示:
CNN中的深度可分离卷积、组卷积、空洞卷积、可变性卷积
(a)图对应3x3的1-dilated conv,和普通的卷积操作一样,(b)图对应3x3的2-dilated conv,实际的卷积kernel size还是3x3,但是空洞为1,也就是对于一个7x7的图像patch,只有9个红色的点和3x3的kernel发生卷积操作,其余的点略过。也可以理解为kernel的size为7x7,但是只有图中的9个点的权重不为0,其余都为0。 可以看到虽然kernel size只有3x3,但是这个卷积的感受野已经增大到了7x7(如果考虑到这个2-dilated conv的前一层是一个1-dilated conv的话,那么每个红点就是1-dilated的卷积输出,所以感受野为3x3,所以1-dilated和2-dilated合起来就能达到7x7的conv © 图是4-dilated conv操作,同理跟在两个1-dilated和2-dilated conv的后面,能达到15x15的感受野。对比传统的conv操作,3层3x3的卷积加起来,stride为1的话,只能达到(kernel-1)*layer+1=7的感受野,也就是和层数layer成线性关系,而dilated conv的感受野是指数级的增长。

dilated的好处是不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息。

因为暂时没有做过目标分割,只是理解了空洞卷积的原理,为什么要使用空洞卷积还不理解,后面补充。

5 可变形卷积(Deformable Conv)

来源自:https://weibo.com/ttarticle/p/show?id=2309404116774126794221

可变形卷积的意思是卷积核不再是矩形,可以是任意的形状。传统的卷积核一般都是长方形或正方形,但MSRA提出了一个相当反直觉的见解,认为卷积核的形状可以是变化的,变形的卷积核能让它只看感兴趣的图像区域 ,这样识别出来的特征更佳。

CNN中的深度可分离卷积、组卷积、空洞卷积、可变性卷积
CNN中的深度可分离卷积、组卷积、空洞卷积、可变性卷积
要做到这个操作,可以直接在原来的过滤器前面再加一层过滤器,这层过滤器学习的是下一层卷积核的位置偏移量(offset),这样只是增加了一层过滤器,或者直接把原网络中的某一层过滤器当成学习offset的过滤器,这样实际增加的计算量是相当少的,但能实现可变形卷积核,识别特征的效果更好。

目前也没用过可变形卷积,后面有了更深的理解再补充。

下面这段话总结的很好,完全摘抄自https://zhuanlan.zhihu.com/p/28749411
启发与思考

现在越来越多的CNN模型从巨型网络到轻量化网络一步步演变,模型准确率也越来越高。现在工业界追求的重点已经不是准确率的提升(因为都已经很高了),都聚焦于速度与准确率的trade off,都希望模型又快又准。因此从原来AlexNet、VGGnet,到体积小一点的Inception、Resnet系列,到目前能移植到移动端的mobilenet、ShuffleNet(体积能降低到0.5mb!),我们可以看到这样一些趋势:

卷积核方面:

  • 大卷积核用多个小卷积核代替;
  • 单一尺寸卷积核用多尺寸卷积核代替;
  • 固定形状卷积核趋于使用可变形卷积核;
  • 使用1×1卷积核(bottleneck结构)。

卷积层通道方面:

  • 标准卷积用depthwise卷积代替;
  • 使用分组卷积;
  • 分组卷积前使用channel shuffle;
  • 通道加权计算。

卷积层连接方面:

  • 使用skip connection,让模型更深;
  • densely connection,使每一层都融合上其它层的特征输出(DenseNet)