赞
踩
原始卷积操作中每一个输出通道都与输入的每一个通道相连接,通道之间是以稠密方式进行连接。而组卷积中输入和输出的通道会被划分为多个组,每个组的输出通道只和对应组内的输入通道相连接,而与其它组的通道无关。这种分组(split)的思想随后被绝大多数的新晋卷积所应用。
将输入特征图按通道均分为g组,然后对每一组进行常规卷积;
由于分组后,每组特征图的通道数为 C i n g \frac{C_{in}}{g} gCin,所以每个卷积核的通道数也降低到 C i n g \frac{C_{in}}{g} gCin;
由于每组内进行的是常规卷积,所以每组至少需要一个卷积核,即分组卷积输出通道数至少为g,如果每组有n个卷积核,则输出 C o u t = n × g , n ≥ 1 C_{out}=n\times g,\ n\geq 1 Cout=n×g, n≥1,所以输出通道数是分组数的整数倍;
综上所述,分组卷积中要求输入和输出通道数均能整除分组数 g。
分组卷积的运算量和参数量的减少,归根结底是一个卷积核本身通道数减少为原来的 g 分之一。
整个分组卷积的参数量:
P
a
r
a
m
s
=
{
C
o
u
t
×
(
C
i
n
g
×
K
1
×
K
2
)
,
b
i
a
s
=
F
a
l
s
e
C
o
u
t
×
(
C
i
n
g
×
K
1
×
K
2
+
1
)
,
b
i
a
s
=
T
r
u
e
Params=\left\{ Cout×(Cing×K1×K2),bias=FalseCout×(Cing×K1×K2+1),bias=True \right.
Params=⎩
⎨
⎧Cout×(gCin×K1×K2),Cout×(gCin×K1×K2+1),bias=Falsebias=True
减少运算量和参数量,相同输入输出大小的情况下,减少为原来的 1 g \frac{1}{g} g1。
隔绝不同组的信息交换。
转置卷积,也称为反卷积(Deconvolution),一般应用在编解码结构中的解码器部分或者DCGAN中的生成器中等。从数学计算上看,“反卷积”相当于是将卷积核转换为稀疏矩阵后进行转置计算,因此,也被称为“转置卷积”。但由于数字信号处理中也有反卷积的概念,所以一般为了不造成歧义,大多数框架的API都会定义为转置卷积。转置卷积是一种特殊的正向卷积,先按照一定的比例通过补 0 来扩大输入图像的尺寸,接着旋转卷积核,再进行正向卷积。
如下图,在2x2的输入图像上应用步长为1、边界全0填充的3x3卷积核,进行转置卷积(反卷积)计算,向上采样后输出的图像大小为4x4。
对于一个输入大小为
3
×
3
3\times 3
3×3的图像,卷积核大小为
2
×
2
2\times 2
2×2:
X
=
[
x
11
x
12
x
13
x
21
x
22
x
23
x
31
x
32
x
33
]
X=[x11x12x13x21x22x23x31x32x33]\\
X=
x11x21x31x12x22x32x13x23x33
W = [ w 11 w 12 w 21 w 22 ] W=[w11w12w21w22] W=[w11w21w12w22]
计算输出 Y Y Y的具体实现方法为矩阵乘法。
将卷积核表示为稀疏矩阵C:
C
=
[
w
11
w
12
0
w
21
w
22
0
0
0
0
0
w
11
w
12
0
w
21
w
22
0
0
0
0
0
0
w
11
w
12
0
w
21
w
22
0
0
0
0
0
w
11
w
12
0
w
21
w
22
]
C=[w11w120w21w2200000w11w120w21w22000000w11w120w21w2200000w11w120w21w22]\\
C=
w11000w12w11000w1200w210w110w22w21w12w110w220w1200w21000w22w21000w22
每一行向量表示在一个位置的卷积操作,0填充表示卷积核未覆盖到的区域。
将输入
X
X
X 展开为列向量:
x
=
[
x
11
x
12
x
13
x
21
x
22
x
23
x
31
x
32
x
33
]
T
x=[x11x12x13x21x22x23x31x32x33]^T
x=[x11x12x13x21x22x23x31x32x33]T
则卷积操作可以表示为:
y
=
C
x
y=Cx
y=Cx
输出向量
y
y
y的大小为
4
×
1
4\times 1
4×1的列向量,改写为矩阵即为
2
×
2
2\times 2
2×2。
转置卷积则是将
y
=
C
x
y=Cx
y=Cx中的输入输出互换:
y
=
C
x
x
=
C
T
y
y=Cx\\ x=C^Ty
y=Cxx=CTy
其中,
C
T
C^T
CT为矩阵
C
C
C的转置,大小为
9
×
4
9\times4
9×4。
4 × 1 4\times1 4×1的输入 y y y经过 C T C^T CT后,得到输出大小为 9 × 1 9\times1 9×1的列向量 x x x,此时的 x , y x,y x,y数值上已经和原来不同,只是在形状上一致。
在实际中,我们大多数时候会使用 stride>1 的转置卷积,从而获得较大的上采样倍率。当 s t r i d e = 2 , ∣ p a d d i n g = 0 stride=2,| padding=0 stride=2,∣padding=0,时,对于 5 × 5 5\times5 5×5的输入使用 3 × 3 3\times 3 3×3的卷积核得到尺寸为 2 × 2 2\times2 2×2的输出矩阵,经过类似上述的推导后可知,这样的操作等同于添加了空洞和填充。对该输出使用转置后的标准卷积核进行计算,过程如图所示。
更一般地,对于卷积核尺寸
k
e
r
n
e
l
s
i
z
e
=
k
kernel_{size} = k
kernelsize=k,步长
s
t
r
i
d
e
=
s
>
1
stride = s > 1
stride=s>1,填充
p
a
d
d
i
n
g
=
p
=
0
padding = p = 0
padding=p=0 的转置卷积,其 等价的标准卷积 在原尺寸为
i
′
i'
i′ 的输入矩阵上进行运算,输出特征图的尺寸
o
′
o'
o′ 为:
o
′
=
s
(
i
′
−
1
)
+
k
o'=s(i'-1)+k
o′=s(i′−1)+k
同时,等价的标准卷积的输入矩阵 input 在卷积运算前,需先进行
p
a
d
d
i
n
g
′
=
k
−
1
padding' =k-1
padding′=k−1的填充,然后相邻元素的空洞数为
s
−
1
s-1
s−1,共有
i
′
−
1
i'-1
i′−1组空洞需要插入;从而,实际尺寸为
i
′
′
=
i
′
+
2
(
k
−
1
)
+
(
i
′
−
1
)
×
(
s
−
1
)
=
s
×
(
i
′
−
1
)
+
2
k
−
1
i''=i'+2(k-1)+(i'-1)\times(s-1)=s\times(i'-1)+2k-1
i′′=i′+2(k−1)+(i′−1)×(s−1)=s×(i′−1)+2k−1。
因此,实际上原计算公式为(等价的标准卷积的步长
s
′
=
1
s'=1
s′=1):
o
′
=
i
′
′
−
k
+
2
p
s
′
+
1
=
s
(
i
′
−
1
)
+
2
k
−
1
−
k
+
1
=
s
(
i
′
−
1
)
+
k
o'=\frac{i''-k+2p}{s'}+1=s(i'-1)+2k-1-k+1=s(i'-1)+k
o′=s′i′′−k+2p+1=s(i′−1)+2k−1−k+1=s(i′−1)+k
可见,通过控制步长
s
t
r
i
d
e
=
s
stride =s
stride=s 的大小可以控制上采样的倍率,而该参数类比于膨胀/空洞卷积的 膨胀率/空洞数。
1×1卷积最初提出的目的是用于增强模型对特定感受野下的局部区域的判定能力。 后续也被**GoogleNet[8]和ResNet[9]**进一步的应用。当卷积核尺寸为1x1时的卷积,也即卷积核变成只有一个数字。如下图:
上图解释了 1 × 1 1\times1 1×1卷积如何适用于尺寸为 H × W × D H\times W\times D H×W×D的输入层,滤波器大小为 1 × 1 × D 1\times1\times D 1×1×D,输出通道的尺寸为 H × W × 1 H\times W\times1 H×W×1。如果应用 n n n个这样的滤波器,然后组合在一起,得到的输出层大小为 H × W × n H\times W\times n H×W×n。
由于 1 × 1 1\times1 1×1卷积并不会改变 height 和 width,改变通道的第一个最直观的结果,就是可以将原本的数据量进行增加或者减少。这里看其他文章或者博客中都称之为升维、降维。但实际情况维度并没有改变,改变的只是通道数 C C C这一个维度的大小而已。
1 × 1 1\times1 1×1卷积核,可以在保持特征图尺度不变的(即不改变)的前提下大幅增加非线性特性(利用后接的非线性激活函数如ReLU)。非线性允许网络学习更复杂的功能,并且使得整个网络能够进一步加深。
使用 1 × 1 1\times1 1×1卷积核,实现降维和升维的操作其实就是间通道信息的线性组合变化。例如:在卷积核大小为 3 × 3 3\times3 3×3,卷积核个数为64的滤波器与卷积核大小为 1 × 1 1\times1 1×1,卷积核个数为28的滤波器组合,其输出层大小等于通过卷积核大小为 3 × 3 3\times3 3×3,卷积核个数为28的滤波器所得到的输出层的大小,原来的64个通道就可以理解为跨通道线性组合变成了28通道,这就是通道间的信息交互。
前面所说的降维,其实也是减少了参数,因为特征图少了,参数也自然跟着就减少,相当于在特征图的通道数上进行卷积,压缩特征图,二次提取特征,使得新特征图的特征表达更佳。
为扩大感受野,在卷积核里面的元素之间插入空格来“膨胀”内核,形成“空洞卷积”(或称膨胀卷积),并用膨胀率参数L表示要扩大内核的范围,即在内核元素之间插入L-1个空格。当L=1时,则内核元素之间没有插入空格,变为标准卷积。
如下图为膨胀率L=2的空洞卷积:
空洞卷积可以任意扩大感受野,且不需要引入额外参数,但如果把分辨率增加了,算法整体计算量肯定会增加。空洞卷积虽然有诸多优点,但在实际中不好优化,速度会大大折扣。
设输入大小为
(
H
,
W
)
(H, W)
(H,W),滤波器大小为
(
f
H
,
f
W
)
(f_H,f_W)
(fH,fW),输出大小为
(
o
H
,
o
W
)
(o_H,o_W)
(oH,oW),填充为
p
p
p,步幅为
s
s
s。此时,输出大小为:
o
H
=
H
+
2
p
−
f
H
s
+
1
o
H
=
W
+
2
p
−
f
W
s
+
1
o_H=\frac{H+2p-f_H}{s}+1\\ o_H=\frac{W+2p-f_W}{s}+1
oH=sH+2p−fH+1oH=sW+2p−fW+1
R F i + 1 = R F i + ( k − 1 ) × S i RF_{i+1}=RF_i+(k-1)\times S_i RFi+1=RFi+(k−1)×Si
其中 R F I + 1 RF_{I+1} RFI+1表示当前层的感受野, R F i RF_i RFi表示上一层的感受野, k k k表示卷积核的大小, S i S_i Si表示之前所有曾的步长的乘积(不包含本层)
深度可分离卷积由两步组成:深度卷积和1x1卷积。
首先,在输入层上应用深度卷积。如下图,使用3个卷积核分别对输入层的3个通道作卷积计算,再堆叠在一起。
再使用1x1的卷积(3个通道)进行计算,得到只有1个通道的结果
重复多次1x1的卷积操作(如下图为128次),则最后便会得到一个深度的卷积结果。
完整的过程如下:
假设输入特征图的尺寸为 D k × D k × M D_k\times D_k \times M Dk×Dk×M,卷积核的尺寸为 D F × D F × M D_F\times D_F \times M DF×DF×M,其数量为 N N N。假设对应特征图空间位置中的每一个点都会进行一次卷及操作,那么可知单个卷积共需要进行 D k × D k × D F × D F × M D_k \times D_k \times D_F \times D_F \times M Dk×Dk×DF×DF×M次计算。那么对 N N N个卷积,其总计算量就为: D k × D k × D F × D F × M × N D_k \times D_k \times D_F \times D_F \times M \times N Dk×Dk×DF×DF×M×N。
对深度可分离卷积卷积进行分析可知:
逐通道卷积(Depthwise Convolution)计算总量为:
D
k
×
D
k
×
D
F
×
D
F
×
M
D_k \times D_k \times D_F \times D_F \times M
Dk×Dk×DF×DF×M
逐点卷积(Pointwise Convolution)的计算总量为:
M
×
N
×
D
k
×
D
k
M\times N\times D_k \times D_k
M×N×Dk×Dk
所以深度可分离卷积的计算总量为:
D
k
×
D
k
×
D
F
×
D
F
×
M
+
M
×
N
×
D
k
×
D
k
D_k \times D_k \times D_F \times D_F \times M+M\times N\times D_k \times D_k
Dk×Dk×DF×DF×M+M×N×Dk×Dk
那么相对于普通卷积,DSC的计算量与普通卷积的比值为:
1
N
+
1
D
F
2
\frac{1}{N}+\frac{1}{D_F^2}
N1+DF21
简单总结一下,DSC作为普通卷积的一种替代品,它的最大优点是计算效率非常高。因此使用DSC构建轻量级模型是当下非常常见的做法。不过DSC的这种高效性是以低精度作为代价的。目前看来,设计高效率、高精度的DSC变体模块仍然是非常热点的研究方向之一。
出自论文Deformable Convolutional Networks
可变形卷积是指卷积核在每一个元素上额外增加了一个参数方向参数,这样卷积核就能在训练过程中扩展到很大的范围。
卷积核的目的是为了提取输入物的特征。我们传统的卷积核通常是固定尺寸、固定大小的(例如3x3,5x5,7x7.)。这种卷积核存在的最大问题就是,对于未知的变化适应性差,泛化能力不强。
卷积单元对输入的特征图在固定的位置进行采样;池化层不断减小着特征图的尺寸;RoI池化层产生空间位置受限的RoI。网络内部缺乏能够解决这个问题的模块,这会产生显著的问题,例如,同一CNN层的激活单元的感受野尺寸都相同,这对于编码位置信息的浅层神经网络并不可取,因为不同的位置可能对应有不同尺度或者不同形变的物体,这些层需要能够自动调整尺度或者感受野的方法。再比如,目标检测虽然效果很好但是都依赖于基于特征提取的边界框,这并不是最优的方法,尤其是对于非网格状的物体而言。解决上述问题最直观的想法就是,我们的卷积核可以根据实际情况调整本身的形状,更好的提取输入的特征。
上图是可变形卷积的学习过程,首先偏差是通过一个卷积层获得,该卷积层的卷积核与普通卷积核一样。输出的偏差尺寸和输入的特征图尺寸一致。生成通道维度是2N,分别对应原始输出特征和偏移特征。这两个卷积核通过双线性插值后向传播算法同时学习。事实上,可变形卷积单元中增加的偏移量是网络结构的一部分,通过另外一个平行的标准卷积单元计算得到,进而也可以通过梯度反向传播进行端到端的学习。加上该偏移量的学习之后,可变形卷积核的大小和位置可以根据当前需要识别的图像内容进行动态调整,其直观效果就是不同位置的卷积核采样点位置会根据图像内容发生自适应的变化,从而适应不同物体的形状、大小等几何形变。然而,这样的操作引入了一个问题,即需要对不连续的位置变量求导。作者在这里借鉴了之前Spatial Transformer Network和若干Optical Flow中warp操作的想法,使用了bilinear插值将任何一个位置的输出,转换成对于feature map的插值操作。同理,类似的想法可以直接用于 (ROI) Pooling中改进。
空间可分离卷积是将卷积核分解为两项独立的核分别进行操作。一个3x3的卷积核分解如下图:
分解后的卷积计算过程如下图,先用3x1的卷积核作横向扫描计算,再用1x3的卷积核作纵向扫描计算,最后得到结果。采用可分离卷积的计算量比标准卷积要少。两次卷积,每次3次乘法(总共6次),乘法较少,计算复杂性下降,网络运行速度更快。
众所周知,通过堆叠卷积层可以捕获丰富的特征信息,其中也包含了冗余信息,这有利于网络对数据有更全面的理解。因此,可以通过常规卷积操作提取丰富的特征信息,对于冗余的特征信息,则利用更价廉的线性变换操作来生成,这样不仅能够有效地降低模型所需计算资源,同时设计简单、易于实现,可以即插即用。
如上图所示,GhostNet模型首先利用少量的卷积核对输入特征图进行特征提取,然后进一步地对这部分特征图进行更价廉的线性变化运算,最后通过Concatenation(拼接操作)生成最终的特征图。具体来讲,使用较少的卷积核(可以是 1 × 1 1\times1 1×1, 3 × 3 3\times3 3×3等等)得到一定通道数的特征图,然后对得到的每个通道特征图使用一些线性变换运算(原文中使用的仍然是卷积操作)进行特征的提取,为了减少计算量,采用了深度可分离卷积,得到的结果可以看作是经过前一层的一系列线性变换得到的;最后将两次卷积的输出特征图在通道维度上堆叠即可。
这个方法减少了非关键特征的学习成本:即通过组合少量卷积核与更廉价的线性变化操作代替常规卷积方式,从而有效降低对计算资源需求的同时,并不影响模型的性能。
扁平卷积是将标准卷积核拆分为3个1x1的卷积核,然后再分别对输入层进行卷积计算。这种方式,跟前面的“空间可分离卷积”类似,如下图:
本文介绍了卷积的一些常见变种,旨在进一步理解卷积的作用、经典思考等,为更加有效地搭建神经网络提供基础材料。对于相关模块的pytorch实现将在从零开始的深度学习实战篇(一)中介绍。
[1] https://blog.csdn.net/qq_39478403/article/details/121181904
[2] https://zhuanlan.zhihu.com/p/115070523
[3] https://zhuanlan.zhihu.com/p/381839221
[4] https://zhuanlan.zhihu.com/p/166736637
[6] 可变形卷积从概念到实现过程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。