0.前言
在原始图像卷积网络的基础上,经过不断的改进和优化,出现了如分组卷积(Group convolution)、空洞卷积(Dilated / Atrous Convolution convolution),深度可分离卷积(Depthwise Seperable Convolution)等各式各样的卷积改进形式。
Depthwise(DW)卷积与Pointwise(PW)卷积,合起来被称作深度可分离卷积,是首先由Google在Xception模型中提出,是对Inception V3 networks改进尝试版,在随后出现的MobileNet网络获得成功。该结构和常规卷积操作类似,可用来提取特征,但相比于常规卷积操作,其参数量和运算成本较低,在一些轻量级网络需求中会常见到这种结构。
目前在模型参数优化(降低参数量且保证网络性能)中,通常有两类工作可做:
- 压缩预训练模型: 获得小型网络的一个办法是减小、分解或压缩预训练网络,例如量化压缩(product quantization)、哈希(hashing )、剪枝(pruning)、矢量编码( vector quantization)和霍夫曼编码(Huffman coding)等;各种分解因子(various factorizations )用来加速预训练网络;网络蒸馏法(distillation ),通过使用大型网络指导小型网络训练。
- 直接选择训练小型模型: 如Xception network中说明了如何对Inception V3 networks使用深度可分离卷积;如Flattened networks利用完全的因式分解的卷积网络构建模型,显示出完全分解网络的潜力;Factorized Networks引入了类似的分解卷积以及拓扑连接的使用;Squeezenet 使用一个bottleneck用于构建小型网络。
1.基本的图像卷积—Basic 2D convolution
引用cs231n中使用的图像卷积示意图:
基本思想是在较大的2D数组上滑动一个小窗口(通常称为“filter”或卷积核),并在每个位置的过滤器元素和相应的输入数组元素之间执行点积,上图是使用的RGB三通道的图像。
关于TensorFlow的tf.nn.conv2d操作实现中需要注意一个地方。有很多关于layout或data format的讨论,默认情况下是NHWC。NHWC只是表示4D张量中尺寸的顺序为:
- N:批次
- H:高度(空间尺寸)
- W:宽度(空间尺寸)
- C:频道(深度)
NHWC是TensorFlow的默认布局; 另一个常用的布局是 NCHW,因为它是NVIDIA DNN库首选的格式。此处的代码示例遵循默认值。这也许也是很多情况下使用GPU加速运算时,NCHW格式的要比NHWC格式的要快的原因,因为NCHW是NVIDIA亲生的格式。
2. 深度卷积 Depthwise convolution
在对多个输入通道执行常规2D卷积中,卷积核的通道数与输入的通道数一致,我们会混合所有通道(对应位置相加)来产生最后的一个输出。深度卷积不一样,每个通道在卷积过程中仍然保持分离,因此称为深度卷积。以下图表可帮助解释其工作原理:
总体上分为三个阶段:
- 将输入图像和滤波器(卷积核)都按照通道划分(输入和滤波器的通道数必须相等)。
- 对于每个通道,将输入与相应的滤波器进行卷积,生成输出张量(2D)。
- 将输出张量堆叠在一起。
在TensorFlow中,对应的op是tf.nn.depthwise_conv2d ; 这个op具有通道倍增的概念,使我们可以为每个输入通道计算多个输出(有点像conv2d中的输出通道数概念 )。
在Pytorch中,对应于 torch.nn.Conv2d 类,直接将参数groups,out_channels都设为in_channels,即可实现depthwise conv。
对于获得的特征图如何进行类似于普通卷积的通道融合操作呢?这就要利用接下来的1x1卷积核了。
3. 1x1卷积 Pointwise Convolution
在完成深度卷积后,执行跨通道进行1x1卷积。
这与前面讨论过的普通卷积操作完全相同,只不过卷积核的尺度由3x3x3变为1x1x3。对于不同的输出通道,重复此步骤。如上图所示深度卷积的输出与1个1x1x3的卷积核返回对应的1个通道上的特征图,多个通道的输出需要同样多个1x1x3的卷积核进行通道融合操作。
在TensorFlow中,此操作称为tf.nn.separable_conv2d。
- Depthwise_filter 负责分通道进行深度特征抽取
- Pointwise_filter 用于多通道特征融合,这两个的实现和我们理解的可分离卷积的过程完全一致!
这样设计的计算量是怎样降低的呢?
4. 参数与计算量对比:
假设对于输入为128x128的一张RGB图像,
卷积核格式 F x F x inC x outC:
- F 表示卷积核的尺度,一般设为奇数,我们使用F=3
- inC表示卷积核的通道数
- outC表示输出特征图(叠加后)的通道数
对于普通卷积:
参数量:3 * 3 * 3 * 16 = 432
计算量:3 * 3 * 3 * 128 * 128 * 16 ≈ 7e6
对于深度可分离卷积:
参数:3 * 3 * 3 + 3 * 16 = 75
计算量:3 * 3 * 3 * 128 * 128 + 128 * 128 * 3 * 16 ≈ 1.2e6
参数个数是常规卷积的约1/5,(会根据参数设置而变化,不是定值),且计算量也大大降低。因此,在参数量相同的前提下,采用Separable Convolution的卷积神经网络层数可以做的更深,自然更可能获得较高的准确度,这对很多轻量级网络的设计都有借鉴。网络的具体实现步骤可参照MobileNet网络相关的项目。
参考: