天天看点

扩展卷积详解 - 组卷积, 深度可分离卷积, 空洞卷积

文章目录

    • 零. Standard Convolution - 标准卷积
    • 一. Group Convolution - 组卷积
    • 二. Depth Separable Convolution - 深度可分离卷积
    • 三. Dilated Convoluton - 扩张卷积
    • 四. 参考

在标准卷积的基础上介绍组卷积, 深度可分离卷积, 空洞卷积.

零. Standard Convolution - 标准卷积

标准卷积运算是这样地:

扩展卷积详解 - 组卷积, 深度可分离卷积, 空洞卷积

对于输入特征为 C ∗ H ∗ W C*H*W C∗H∗W, 卷积核大小为 K ∗ K K*K K∗K, 共 N 个卷积核. 则:

  • 对于输出特征图上的每一个点, 都是在输入特征图的所有通道上执行 add 操作得到.
  • 输出特征图的通道数为 N N N.
  • 每个卷积核的尺寸为 C ∗ K ∗ K C*K*K C∗K∗K.
  • N 个卷积核的总参数量为 N ∗ C ∗ K ∗ K N*C*K*K N∗C∗K∗K.

输入特征图与输出特征图的连接方式如下图所示:

扩展卷积详解 - 组卷积, 深度可分离卷积, 空洞卷积

一. Group Convolution - 组卷积

最早出现分组卷积的是 AlexNet. 分组卷积, 顾名思义就是将原始卷积中的输入特征按照通道进行分组, 每个组卷积只对同组通道内的特征图执行卷积运算.

扩展卷积详解 - 组卷积, 深度可分离卷积, 空洞卷积

给定, 输入特征图为: C × H × W C×H×W C×H×W, 卷积核大小为 K × K K×K K×K, 卷积核共有 N 个. 我们按照通道数分为 g 个组, 一般来讲, g 应该可以被 N 整除. 则:

  • 每个组的特征通道数量为 C g \frac{C}{g} gC​.
  • 每个组的卷积核尺寸为 N / g × C / g × K × K N/g×C/g×K×K N/g×C/g×K×K.
  • 每个组得到的输出特征图为 N / g × H × W N/g × H × W N/g×H×W.
  • 拼接 g 个组的输出特征图, 得到和标准卷积尺度一样的输出特征图, 即 N × H × W N×H×W N×H×W.

特点:

1. 分组卷积可以减小卷积参数的个数, 总参数量为 g ∗ ( N × C × K × K g 2 ) = N × C × K × K g g*(\frac{N×C×K×K}{g^2}) = \frac{N×C×K×K}{g} g∗(g2N×C×K×K​)=gN×C×K×K​.

2. 分组卷积可以看成是 structured sparse, 对上图所示的, N / g × C / g × K × K N/g×C/g×K×K N/g×C/g×K×K 卷积核可以看作 N / g × ( C − C / g ) × K × K N/g×(C-C/g)×K×K N/g×(C−C/g)×K×K 这部分卷积核的值为 0, 有时甚至可以在减少参数量的同时获得更好的效果 (起到类似正则化的作用) .

二. Depth Separable Convolution - 深度可分离卷积

深度可分离卷积是在 mobileNet 和 Xception 中都有涉及的一个操作.

在分组卷积中, 我们考虑一种特殊情况, 如果输入特征图的尺寸等于输出特征图的尺寸 (H × W 不变) , 如果我们把输入特征图的通道数 C1 分成 C1个组, 也就是每个组都只有 1 个通道, 那么我们用 1 × 1 × K × K 的卷积核来对每组进行卷积, 同时拼接 C1 个组的结果, 得到输出特征图的通道仍为 C1 × H × W, 这其实就是深度可分离卷积.

对于可分离卷积, 我认为其可以分为两种形式, 一种是空间可分离卷积, 顾名思义, 空间可分离就是将一个大的卷积核变成两个小的卷积核, 也就是在 inception 系列中出现的把 3 × 3卷积分成对称的 1×3 与 3×1 的操作, 另一种就是深度可分离卷积, 深度可分离卷积也可分为两部分, 深度卷积+逐点卷积, 深度卷积就是在每个通道上执行卷积, 但是不整合所有对应通道上的结果 (没有通道级别对应的 add 操作) ; 逐点卷积其实就是 1x1 3D 卷积, 对所有通道进行融合.

扩展卷积详解 - 组卷积, 深度可分离卷积, 空洞卷积

图 (a) 代表标准卷积. 假设输入特征图尺寸为 M ∗ H ∗ W M*H*W M∗H∗W, 卷积核尺寸为 M ∗ D k ∗ D k M*D_{k}*D_{k} M∗Dk​∗Dk​ , 共 N N N 个卷积核, 输出特征图尺寸为 N ∗ H ∗ W N*H*W N∗H∗W, 标准卷积层的参数量为: N ∗ M ∗ D k ∗ D k N*M*D_{k}*D_{k} N∗M∗Dk​∗Dk​.

图 (b) 就是深度卷积, 把输入特征图上的每一个通道单独执行卷积操作, 也就是用 M M M 个 1 ∗ D k ∗ D k 1*D_{k}*D_{k} 1∗Dk​∗Dk​ 的卷积核对输入特征图上的每一个通道执行卷积操作, 最终得到的输出特征图的尺寸仍然为 M ∗ H ∗ W M*H*W M∗H∗W, 参数数量为 M ∗ D k ∗ D k M*D_{k}*D_{k} M∗Dk​∗Dk​.

图 © 为逐点卷积, 也就是常规的 1 × 1 1×1 1×1 卷积操作, 输入特征图为 M ∗ H ∗ W M*H*W M∗H∗W, 卷积核的尺寸为 M ∗ 1 ∗ 1 M*1*1 M∗1∗1 , 共 N N N 个卷积核, 输出特征图尺寸为 N ∗ H ∗ W N*H*W N∗H∗W. 参数数量为 N ∗ M N*M N∗M.

那么图 (b) 与图 © 的操作结合之后就是深度可分离卷积. 深度可分离卷积的作用就是降参, 我们来对比一下标准卷积与深度可分离卷积的参数个数:

( M ∗ D k ∗ D k + N ∗ M ) N ∗ M ∗ D k ∗ D k = 1 N + 1 D k 2 \frac{ (M*D_{k}*D_{k}+N*M)}{N*M*D_{k}*D_{k}}=\frac{1}{N}+\frac{1}{D_{k}^{2}} N∗M∗Dk​∗Dk​(M∗Dk​∗Dk​+N∗M)​=N1​+Dk2​1​

如果我们用 3 ∗ 3 3*3 3∗3 的卷积, 那么相当于我们大约可以减少 10 倍的参数计算量.

深度可分离卷积与标准卷积相比, MobileNet1 在 ImageNet 上降低了约 1% 的精度.

三. Dilated Convoluton - 扩张卷积

扩张卷积又名空洞卷积 (atrous convolutions), 通过向卷积层引入了一个称为 "扩张率 (dilation rate) " 的参数, 该参数定义了卷积核处理数据时各值的间距.

直观地感受一下空洞卷积的计算方式:

扩展卷积详解 - 组卷积, 深度可分离卷积, 空洞卷积

其公式表示为:

y [ i ] = ∑ k = 0 K − 1 x [ i + r ∗ k ] ⋅ w [ k ] y[i] = \sum_{k = 0}^{K-1}x[i+r*k] \cdot w[k] y[i]=k=0∑K−1​x[i+r∗k]⋅w[k]

其中,

  • y y y 表示输出特征图.
  • w w w 表示卷积核的权重值.
  • K K K 表示卷积核的大小.
  • x x x 表示输入特征图.

换句话说, 与标准卷积相比, 扩张卷积多了一个超参数 (扩张率), 其指定了 kernel 各点之间的间隔的点数. 因此, 标准卷积的扩张率为 1.

四. 参考

[1]. 理解分组卷积与深度可分离卷积

[2]. Group Convolution组卷积

[3]. 如何理解空洞卷积 (dilated convolution)?

继续阅读