深度可分离卷积
最近写论文过程中用到了轻量级网络,其中深度可分离卷积可以大幅减少传统卷积的参数。本文记录深度可分离卷积的原理和参数计算。
FLOPs与参数量
FLOPs 用来衡量模型的时间复杂度,即计算机的算力。
- 卷积层计算方式:$(2\times C_{in}\times k^{2}- 1) \times H\times W\times C_{out} = (C_{in}\times k^{2}- 1+ C_{in}\times k^{2})\times H\times W\times C_{out}$,$C_{in}$输入通道,$C_{out}$输出通道,$k$为卷积大小,$H$和$W$分别为特征图的高和宽,当无偏置时,有$-1$,有偏置,无$-1$。
- 全连接层计算方式:$(2\times N_{in}-1)\times N_{out} $,$N_{in}$为输入神经元数,$N_{out}$为输出神经元数。
- LSTM层计算方式:$(E+H) \times H \times 4 \times2$,$E$为词向量维度,即$Input _ size$,$H$为隐藏神经元个数,即$Hidden _ size$。
- GRU层计算方式:$(E+H) \times H \times 3 \times2$。
参数量 用来衡量模型的空间复杂度,即内存资源的消耗。
- 卷积层计算方式:$( C_{in}\times k^{2}+ 1)\times C_{out}$,当无偏置时,无$+1$,有偏置,有$+1$。
- 全连接层计算方式:$( N_{in}+1)\times N_{out} $。
- LSTM层计算方式:$((E+H \times H) +H)\times 4$。
- GRU层计算方式:$((E+H \times H) +H)\times 3$。
常规卷积
输入:(1,4,5,5)
,卷积核:Conv2d(4,6,kernel=3,padding=1,stride=1,groups=1,bias=False)
,输出:(1,6,5,5)
,FLOPs:(2×4×3×3-1)×5×5×6=10650
,参数量:(4×3×3+0)×6=216
。
分组卷积(Group Convolution)
分组卷积,即ResNeXt,是受到Inception和AlexNet的启发。Inception 的论文中提到,对于卷积来说,卷积核可以看做一个三维的滤波器:通道维+空间维(Feature Map 的宽和高),常规的卷积操作其实就是实现通道相关性和空间相关性的联合映射。Inception 模块的背后存在这样的一种假设:卷积层通道间的相关性和空间相关性是可以退耦合的,将它们分开映射,能达到更好的效果.具体来说,经过不同卷积路径得到的特征图之间的耦合性较低,关注的主要特征不同,可以得到互为补充的特征图,以更完整的表示图像。
输入:(1,4,5,5)
,卷积核:Conv2d(4,6,kernel=3,padding=1,stride=1,groups=2,bias=False)
,输出:(1,6,5,5)
,FLOPs:(2×2×3×3-1)×5×5×1×3×2=5250
,参数量:(2×3×3+0)×1×3×2=108
。
深度可分离卷积(Depthwise Separable Convolution)
逐通道卷积(Depthwise Convolution)
逐通道卷积的实质就是输出通道和分组等于输入通道的分组卷积。
输入:(1,4,5,5)
,卷积核:Conv2d(4,4,kernel=3,padding=1,stride=1,groups=4,bias=False)
,输出:(1,4,5,5)
,FLOPs:(2×1×3×3-1)×5×5×1×4=1700
,参数量:(1×3×3+0)×1×4=36
。
逐点卷积(Pointwise Convolution)
逐点卷积的实质就是卷积核大小为1的普通卷积。逐通道卷积完成后的通道数量与输入层的通道数相同,无法改变通道数。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的特征信息。因此需要逐点卷积来将这些特征图进行组合生成新的特征图。
输入:(1,4,5,5)
,卷积核:Conv2d(4,6,kernel=1,padding=1,stride=1,groups=1,bias=False)
,输出:(1,6,5,5)
,FLOPs:(2×4×1×1-1)×5×5×1×6=1050
,参数量:(4×1×1+0)×1×6=24
。
深度可分离卷积
FLOPs:1700+1050=2750,参数量:36+24=60。
参考文章
CNN 模型所需的计算力(flops)和参数(parameters)数量是怎么计算的? - 知乎 (zhihu.com)
深度可分离卷积(Depthwise Separable Convolution)和分组卷积(Group Convolution)的理解及PyTorch实现 - 知乎 (zhihu.com)