最近写论文过程中用到了轻量级网络,其中深度可分离卷积可以大幅减少传统卷积的参数。本文记录深度可分离卷积的原理和参数计算。

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

绘图1

分组卷积(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

绘图2

深度可分离卷积(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

绘图3

逐点卷积(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

绘图4

深度可分离卷积

FLOPs:1700+1050=2750,参数量:36+24=60。

参考文章

CNN 模型所需的计算力(flops)和参数(parameters)数量是怎么计算的? - 知乎 (zhihu.com)

深度可分离卷积 - 知乎 (zhihu.com)

深度可分离卷积(Depthwise Separable Convolution)和分组卷积(Group Convolution)的理解及PyTorch实现 - 知乎 (zhihu.com)