轻量卷积神经网络的一些操作

本文主要记录一些在卷积神经网络轻量化的研究中出现的一些操作,其主要是针对卷积进行的。

Depthwise Convolution and Pointwise Convolution

深度卷积 分解一个标准的卷积为一个 depthwise convolution 和一个 pointwise convolution, 是对输入的每一个 channel 独立进行卷积,输入 feature map 的每个 channel 会输出 channel_multiplier (通常为 1) 个通道,最后的 feature map 就会有 in_channels * channel_multiplier 个通道了。


传统卷积和深度卷积以及逐点卷积的对比_1


传统卷积和深度卷积以及逐点卷积的对比_2


Group Convolution and channel shuffle

分组卷积

Group Convolution 顾名思义,是对输入 feature map 进行分组,然后每组分别卷积。假设输入 feature map 的尺寸为 CHWC∗H∗W,输出 feature map 的数量为 NN,如果设定要分成 GG 个 groups,则每组的输入 feature map 数量为CG\frac{C}{G},每组的输出 feature map 数量为NG\frac{N}{G},每个卷积核的尺寸为CG×K×K\frac{C}{G}\times K\times K,卷积核的总数仍为 NN 个,每组的卷积核数量为 NG\frac{N}{G},卷积核只与其同组的输入 map 进行卷积,卷积核的总参数量为 N×CG×K×KN\times \frac{C}{G}\times K\times K,可见,总参数量减少为原来的 1G\frac{1}{G},其连接方式如上图右所示,group 1 的输出 map 数为 2,有 2 个卷积核,每个卷积核的 channel 数为 4,与 group1 的输入 map 的 channel 数相同,卷积核只与同组的输入 map 卷积,而不与其他组的输入 map 卷积。

Channel shuffle: 因为在同一组中不同的通道蕴含的信息可能是相同的,如果不进行通道交换的话,学出来的特征会非常局限。如果在不同的组之后交换一些通道,那么就能交换信息,使得各个组的信息更丰富,能提取到的特征自然就更多,这样是有利于得到更好的结果。


Channel Shuffle

ShuffleNet主要拥有两个创新点:

  1. pointwise group convolution 逐点组卷积,就是带分组的卷积核为1×1的卷积,也就是说逐点组卷积是卷积核为 1×1 的分组卷积
  2. channel shuffle

原因:

  1. 逐点卷积占了很大的计算量 ———> 逐点分组卷积
  2. 不同组之间特征通信问题 ———> channel shuffle

GDC : 更进一步,如果分组数 G=N=CG=N=C,同时卷积核的尺寸与输入 map 的尺寸相同,即 K=H=WK=H=W,则输出 map 为 C11C∗1∗1 即长度为 CC 的向量,此时称之为 Global Depthwise Convolution(GDC),见 MobileFaceNet,可以看成是全局加权池化,与 Global Average Pooling(GAP) 的不同之处在于,GDC 给每个位置赋予了可学习的权重(对于已对齐的图像这很有效,比如人脸,中心位置和边界位置的权重自然应该不同),而 GAP 每个位置的权重相同,全局取个平均,如下图所示:


Global Depthwise Convolution


Squeeze-and-Excitation module

SE module 通过学习的方式来自动获取到每个特征通道的重要程度,然后依照计算出来的重要程度去提升有用的特征并抑制对当前任务用处不大的特征。
SE module


  1. 首先做普通的卷积,得到了一个 output feature map,它的 shape 为 [CHW][C,H,W],根据论文观点,这个 feature map 的特征很混乱。为了获得重要性的评价指标,直接对这个 feature map 做一个 Global Average Pooling,然后我们就得到了长度为 CC 的向量。(这里还涉及到一个额外的东西,如果你了解卷积,你就会发现一旦某一特征经常被激活,那么 Global Average Pooling 计算出来的值会比较大,说明它对结果的影响也比较大,反之越小的值,对结果的影响就越小)
  2. 然后我们对这个向量加两个 FC 层,做非线性映射,这两个 FC 层的参数,也就是网络需要额外学习的参数。
  3. 最后输出的向量,我们可以看做特征的重要性程度,然后与 feature map 对应 channel 相乘就得到特征有序的 feature map 了。

文章作者: taosean
文章链接: https://taosean.github.io/2019/06/03/light-weight-CNN-operations/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 taosean's 学习之旅