赞
踩
在标准卷积的基础上介绍组卷积, 深度可分离卷积, 空洞卷积.
标准卷积运算是这样地:
对于输入特征为 C ∗ H ∗ W C*H*W C∗H∗W, 卷积核大小为 K ∗ K K*K K∗K, 共 N 个卷积核. 则:
输入特征图与输出特征图的连接方式如下图所示:
最早出现分组卷积的是 AlexNet. 分组卷积, 顾名思义就是将原始卷积中的输入特征按照通道进行分组, 每个组卷积只对同组通道内的特征图执行卷积运算.
给定, 输入特征图为: C × H × W C×H×W C×H×W, 卷积核大小为 K × K K×K K×K, 卷积核共有 N 个. 我们按照通道数分为 g 个组, 一般来讲, g 应该可以被 N 整除. 则:
特点:
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, 有时甚至可以在减少参数量的同时获得更好的效果 (起到类似正则化的作用) .
深度可分离卷积是在 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+Dk21
如果我们用 3 ∗ 3 3*3 3∗3 的卷积, 那么相当于我们大约可以减少 10 倍的参数计算量.
深度可分离卷积与标准卷积相比, MobileNet1 在 ImageNet 上降低了约 1% 的精度.
扩张卷积又名空洞卷积 (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−1x[i+r∗k]⋅w[k]
其中,
换句话说, 与标准卷积相比, 扩张卷积多了一个超参数 (扩张率), 其指定了 kernel 各点之间的间隔的点数. 因此, 标准卷积的扩张率为 1.
[1]. 理解分组卷积与深度可分离卷积
[2]. Group Convolution组卷积
[3]. 如何理解空洞卷积 (dilated convolution)?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。