本文中关于卷积和反卷积内容主要参考论文《A guide to convolution arithmetic for deep learning》1
卷积
一个2D卷积的示意图如下(在实际CNN中,我们更常使用3D卷积,其卷积核是3D的):
有填充(zero paddind) |
无填充(no padding) |
|
|
各种形式的卷积算法
因为在各个通道上的卷积是独立的,因此在这里我们就二维单通道卷积,讨论各种参数下卷积.为方便讨论,做出如下假设:
- 输入是正方形的(i1=i2=i)
- 卷积核是正方形的.(k1=k2=k)
- 两个维度上的卷积步长相等(s1=s2=s)
- 两个维度上的填充层数相同(p1=p2=p)
下面分别讨论卷积参数i,k,p,s不同造成的卷积结果的不同2:
|
|
|
|
No padding, no strides |
Arbitrary padding, no strides |
Half padding, no strides |
Full padding, no strides |
|
|
|
|
No padding, strides |
Padding, strides |
Padding, strides (odd) |
|
无填充,单位步长(no zero padding, unit strides)卷积
在i,k取值任意,s=1,p=0的情况下:
o=(i−k)+1
有填充,单位步长(zero padding, unit strides)卷积
在i,k,p取值任意,s=1的情况下:
o=(i−k)+2p+1
根据p的取值,有以下两种特殊的padding::
-
half (same) padding
half (same) padding下,输入与输出的尺寸相同.
在k为奇数(k=2n+1,n∈N),s=1,p=⌊k/2⌋=n的情况下:
o=i+2⌊k/2⌋−(k−1)=i+2n−2n=i
-
full padding
full padding下,输入的每个像素都参与了同样次数的卷积
在i和k取值任意,p=k−1且s=1的情况下:
o=i+2(k−1)−(k−1)=i+(k−1)
无填充,非单位步长(no zero padding, non-unit strides)卷积
在非单位步长下,有可能最后一次卷积并没有接触到输入的末尾.这导致了一些像素没能被卷积到,因此在计算输出形状时有向下取整(⌊⌋)运算
在i和k取值任意,p=k−1且s=1的情况下:
o=⌊si−k⌋+1
有填充,非单位步长(zero padding, non-unit strides)卷积
这是卷积运算的最一般形式,下面两个示意图分别展示最后一次卷积接触到和未接触到输入的末尾的情况:
在i,k,p和s取值任意的情况下:
o=⌊si+2p−k⌋+1
反卷积(transposed convolution, deconvolution)
反卷积(transposed convolution, deconvolution)与卷积正相反3,可用于将卷积结果在尺寸上放大,实现上采样(upsampling).
反卷积的数学证明
要理解反卷积,首先卷积是如何实现的,卷积在数学上实际是通过矩阵乘法实现的,对于下述卷积,我们将其表示成矩阵运算的形式:
先分别将输入input和输出output分别展开为列向量X和Y:
XY=[x1x2x3x4x5x6x7x8x9x10x11x12x13x14x15x16]T=[y1y2y3y4]T
构造矩阵C
C=⎣⎢⎢⎡w0,0000w0,1w0,000w0,2w0,1000w0,200w1,00w0,00w1,1w1,0w0,1w0,0w1,2w1,1w0,2w0,10w1,20w0,2w2,00w1,00w2,1w2,0w1,1w1,0w2,2w2,1w1,2w1,10w2,20w1,200w2,0000w2,1w2,000w2,2w2,1000w2,2⎦⎥⎥⎤
则卷积运算可被表示为
Y=CX
卷积运算的反向传播计算公式为
∂X∂J=∂Y∂JCT
因此反卷积运算可表示为
X=(CTC)−1CTY
使用卷积实现反卷积
卷积和反卷积在数学上都是用矩阵运算实现的,因此,每个反卷积运算都可以用对应的卷积运算来表示,下面分析各种反卷积运算的卷积形式.
|
|
|
|
No padding, no strides, transposed |
Arbitrary padding, no strides, transposed |
Half padding, no strides, transposed |
Full padding, no strides, transposed |
|
|
|
|
No padding, strides, transposed |
Padding, strides, transposed |
Padding, strides, transposed (odd) |
|
无填充,单位步长(no zero padding, unit strides)卷积的反卷积
|
示意图 |
卷积 |
|
反卷积 |
|
i和k取值任意,s=1,p=0的卷积所对应的反卷积参数为k′=k,s′=s,p′=k−1
o′=i′+(k−1)
可以用fully padding卷积来实现no padding卷积的反卷积.
有填充,单位步长(zero padding, unit strides)卷积的反卷积
|
示意图 |
卷积 |
|
反卷积 |
|
i,k,p取值任意,s=1的卷积所对应的反卷积参数为k’=k,s′=s,p′=k−p−1
o′=i′+(k−1)−2p
两种特殊padding所对应的反卷积如下:
-
half(same) padding卷积的反卷积
|
示意图 |
卷积 |
|
反卷积 |
|
k为奇数(k=2n+1,n∈N),s=1,p=⌊k/2⌋=n的卷积所对应的反卷积参数为k′=k,s′=s,p′=p
o′=i′+(k−1)−2⌊k/2⌋=i+2n−2n=i
可以用same padding来实现same padding卷积的反卷积.
-
full padding卷积的反卷积
|
示意图 |
卷积 |
|
反卷积 |
|
k取值任意,s=1,p=k−1的卷积所对应的反卷积参数为k′=k,s′=s,p′=0
o′=i′+(k−1)−2p=i′−(k−1)
可以用no padding来实现fully padding卷积的反卷积.
无填充,非单位步长(no zero padding, non-unit strides)卷积的反卷积
直观来看,对于非单位步长的卷积,其反卷积的步长应为分数,这也解释了为什么反卷积又被称为分数步长卷积.我们实现分数步长的手段是在输入input′的每一行和列之间插入对应数量的空行列,并将反卷积的卷积步长s′设为1,这样就实现了分数步长卷积.
|
示意图 |
卷积 |
|
反卷积 |
|
k,s取值任意,p=0的且i−k为s的整数倍的卷积所对应的反卷积参数为k′=k,s′=1,p′=k−1,i′尺寸为原输入每行每列之插入s−1个空行列.
o′=s(i′−1)+k
有填充,非单位步长(no zero padding, non-unit strides)卷积的反卷积
在这里,根据i+2p−k是否能够整除s做出讨论:
-
i+2p−k能够整除s
|
示意图 |
卷积 |
|
反卷积 |
|
k,s,p取值任意,且i+2p−k为s的整数倍的卷积所对应的反卷积参数为k′=k,s′=1,p′=k−p−1,i′尺寸为原输入每行每列间插入s−1个空行列.
o′=s(i′−1)+k−2p
-
i+2p−k不能整除s
|
示意图 |
卷积 |
|
反卷积 |
|
k,s,p取值任意,且i+2p−k模s为a的卷积所对应的反卷积参数为k′=k,s′=1,p′=k−p−1,i′尺寸为原输入每行每列间插入s−1个空行列,且在最下行和最右列初再加a个空行列.
o′=s(i′−1)+a+k−2p
空洞卷积
-
Dumoulin V , Visin F . A guide to convolution arithmetic for deep learning[J]. 2016. ↩︎
-
图片来源:https://github.com/vdumoulin/conv_arithmetic ↩︎
-
这里讨论的是CNN中的反卷积,不同于数学上的反卷积运算. ↩︎