理解CNN中的卷积和反卷积

时间:2024-03-29 07:50:38

本文中关于卷积和反卷积内容主要参考论文《A guide to convolution arithmetic for deep learning》1

卷积

一个2D卷积的示意图如下(在实际CNN中,我们更常使用3D卷积,其卷积核是3D的):

理解CNN中的卷积和反卷积

有填充(zero paddind) 无填充(no padding)
理解CNN中的卷积和反卷积 理解CNN中的卷积和反卷积

各种形式的卷积算法

因为在各个通道上的卷积是独立的,因此在这里我们就二维单通道卷积,讨论各种参数下卷积.为方便讨论,做出如下假设:

  1. 输入是正方形的(i1=i2=ii_1 = i_2 = i)
  2. 卷积核是正方形的.(k1=k2=kk_1=k_2=k)
  3. 两个维度上的卷积步长相等(s1=s2=ss_1 = s_2 = s)
  4. 两个维度上的填充层数相同(p1=p2=pp_1 = p_2 = p)

下面分别讨论卷积参数ii,kk,pp,ss不同造成的卷积结果的不同2:

理解CNN中的卷积和反卷积 理解CNN中的卷积和反卷积 理解CNN中的卷积和反卷积 理解CNN中的卷积和反卷积
No padding, no strides Arbitrary padding, no strides Half padding, no strides Full padding, no strides
理解CNN中的卷积和反卷积 理解CNN中的卷积和反卷积 理解CNN中的卷积和反卷积
No padding, strides Padding, strides Padding, strides (odd)

无填充,单位步长(no zero padding, unit strides)卷积

理解CNN中的卷积和反卷积

ii,kk取值任意,s=1s=1,p=0p=0的情况下:

o=(ik)+1 o = (i-k)+1

有填充,单位步长(zero padding, unit strides)卷积

理解CNN中的卷积和反卷积

ii,kk,pp取值任意,s=1s=1的情况下:
o=(ik)+2p+1 o = (i-k)+2p+1

根据pp的取值,有以下两种特殊的padding::

  1. half (same) padding

    half (same) padding下,输入与输出的尺寸相同.

    理解CNN中的卷积和反卷积

    kk为奇数(k=2n+1,nNk=2n+1, n \in \mathbb{N}),s=1s=1,p=k/2=np= \lfloor k/2 \rfloor = n的情况下:
    o=i+2k/2(k1)=i+2n2n=i o = i + 2 \lfloor k/2 \rfloor − (k − 1) = i + 2n − 2n = i

  2. full padding

    full padding下,输入的每个像素都参与了同样次数的卷积

    理解CNN中的卷积和反卷积

    iikk取值任意,p=k1p=k-1s=1s=1的情况下:

    o=i+2(k1)(k1)=i+(k1) o = i + 2(k − 1) − (k − 1) = i + (k − 1)

无填充,非单位步长(no zero padding, non-unit strides)卷积

在非单位步长下,有可能最后一次卷积并没有接触到输入的末尾.这导致了一些像素没能被卷积到,因此在计算输出形状时有向下取整(\lfloor \rfloor)运算

理解CNN中的卷积和反卷积

iikk取值任意,p=k1p=k-1s=1s=1的情况下:

o=iks+1 o = \left\lfloor \frac{i-k}{s} \right\rfloor + 1

有填充,非单位步长(zero padding, non-unit strides)卷积

这是卷积运算的最一般形式,下面两个示意图分别展示最后一次卷积接触到和未接触到输入的末尾的情况:

理解CNN中的卷积和反卷积

理解CNN中的卷积和反卷积

ii,kk,ppss取值任意的情况下:

o=i+2pks+1 o = \left\lfloor \frac{i+2p-k}{s} \right\rfloor + 1

反卷积(transposed convolution, deconvolution)

反卷积(transposed convolution, deconvolution)与卷积正相反3,可用于将卷积结果在尺寸上放大,实现上采样(upsampling).

反卷积的数学证明

要理解反卷积,首先卷积是如何实现的,卷积在数学上实际是通过矩阵乘法实现的,对于下述卷积,我们将其表示成矩阵运算的形式:

理解CNN中的卷积和反卷积

先分别将输入inputinput和输出outputoutput分别展开为列向量XXYY:
X=[x1x2x3x4x5x6x7x8x9x10x11x12x13x14x15x16]TY=[y1y2y3y4]T \begin{aligned} X &= [x^1 x^2 x^3 x^4 x^5 x^6 x^7 x^8 x^9 x^{10} x^{11} x^{12} x^{13} x^{14} x^{15} x^{16}]^T \\ Y &= [y^1 y^2 y^3 y^4]^T \end{aligned}
构造矩阵CC
C=[w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,2000000w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,200000000w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,2000000w0,0w0,1w0,20w1,0w1,1w1,20w2,0w2,1w2,2] C = \begin{bmatrix} w_{0,0} & w_{0,1} & w_{0,2} & 0 & w_{1,0} & w_{1,1} & w_{1,2} & 0 & w_{2,0} & w_{2,1} & w_{2,2} & 0 & 0 & 0 & 0 & 0 \\ 0 & w_{0,0} & w_{0,1} & w_{0,2} & 0 & w_{1,0} & w_{1,1} & w_{1,2} & 0 & w_{2,0} & w_{2,1} & w_{2,2} & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & w_{0,0} & w_{0,1} & w_{0,2} & 0 & w_{1,0} & w_{1,1} & w_{1,2} & 0 & w_{2,0} & w_{2,1} & w_{2,2} & 0 \\ 0 & 0 & 0 & 0 & 0 & w_{0,0} & w_{0,1} & w_{0,2} & 0 & w_{1,0} & w_{1,1} & w_{1,2} & 0 & w_{2,0} & w_{2,1} & w_{2,2} \end{bmatrix}
则卷积运算可被表示为
Y=CX Y = C X
卷积运算的反向传播计算公式为
JX=JYCT \frac{\partial{J}}{\partial{X}} = \frac{\partial{J}}{\partial{Y}} C^T


因此反卷积运算可表示为
X=(CTC)1CTY X = (C^T C)^{-1} C^T Y

使用卷积实现反卷积

卷积和反卷积在数学上都是用矩阵运算实现的,因此,每个反卷积运算都可以用对应的卷积运算来表示,下面分析各种反卷积运算的卷积形式.

理解CNN中的卷积和反卷积 理解CNN中的卷积和反卷积 理解CNN中的卷积和反卷积 理解CNN中的卷积和反卷积
No padding, no strides, transposed Arbitrary padding, no strides, transposed Half padding, no strides, transposed Full padding, no strides, transposed
理解CNN中的卷积和反卷积 理解CNN中的卷积和反卷积 理解CNN中的卷积和反卷积
No padding, strides, transposed Padding, strides, transposed Padding, strides, transposed (odd)

无填充,单位步长(no zero padding, unit strides)卷积的反卷积

  示意图
卷积 理解CNN中的卷积和反卷积
反卷积 理解CNN中的卷积和反卷积

iikk取值任意,s=1s=1,p=0p=0的卷积所对应的反卷积参数为k=kk'=k,s=ss'=s,p=k1p'=k-1

o=i+(k1) o' = i' + (k-1)

可以用fully padding卷积来实现no padding卷积的反卷积.

有填充,单位步长(zero padding, unit strides)卷积的反卷积

  示意图
卷积 理解CNN中的卷积和反卷积
反卷积 理解CNN中的卷积和反卷积

ii,kk,pp取值任意,s=1s=1的卷积所对应的反卷积参数为k=kk’=k,s=ss'=s,p=kp1p'=k-p-1
o=i+(k1)2p o' = i' + (k − 1) − 2p

两种特殊padding所对应的反卷积如下:

  1. half(same) padding卷积的反卷积

      示意图
    卷积 理解CNN中的卷积和反卷积
    反卷积 理解CNN中的卷积和反卷积

    kk为奇数(k=2n+1,nNk=2n+1, n \in \mathbb{N}),s=1s=1,p=k/2=np= \lfloor k/2 \rfloor = n的卷积所对应的反卷积参数为k=kk'=k,s=ss'=s,p=pp'=p
    o=i+(k1)2k/2=i+2n2n=i o' = i' + (k − 1) - 2 \lfloor k/2 \rfloor = i + 2n − 2n = i

    可以用same padding来实现same padding卷积的反卷积.

  2. full padding卷积的反卷积

      示意图
    卷积 理解CNN中的卷积和反卷积
    反卷积 理解CNN中的卷积和反卷积

    kk取值任意,s=1s = 1,p=k1p = k−1的卷积所对应的反卷积参数为k=kk'=k,s=ss'=s,p=0p'=0
    o=i+(k1)2p=i(k1) o' = i' + (k − 1) - 2p= i' -(k-1)

    可以用no padding来实现fully padding卷积的反卷积.

无填充,非单位步长(no zero padding, non-unit strides)卷积的反卷积

直观来看,对于非单位步长的卷积,其反卷积的步长应为分数,这也解释了为什么反卷积又被称为分数步长卷积.我们实现分数步长的手段是在输入inputinput'的每一行和列之间插入对应数量的空行列,并将反卷积的卷积步长ss'设为11,这样就实现了分数步长卷积.

  示意图
卷积 理解CNN中的卷积和反卷积
反卷积 理解CNN中的卷积和反卷积

kk,ss取值任意,p=0p =0的且iki-kss的整数倍的卷积所对应的反卷积参数为k=kk'=k,s=1s'=1,p=k1p'=k-1,ii'尺寸为原输入每行每列之插入s1s-1个空行列.
o=s(i1)+k o' = s(i' − 1) + k

有填充,非单位步长(no zero padding, non-unit strides)卷积的反卷积

在这里,根据i+2pki + 2p − k是否能够整除ss做出讨论:

  1. i+2pki + 2p − k能够整除ss

      示意图
    卷积 理解CNN中的卷积和反卷积
    反卷积 理解CNN中的卷积和反卷积

    kk,ss,pp取值任意,且i+2pki+2p-kss的整数倍的卷积所对应的反卷积参数为k=kk'=k,s=1s'=1,p=kp1p'=k-p-1,ii'尺寸为原输入每行每列间插入s1s-1个空行列.

    o=s(i1)+k2p o' = s(i' − 1) + k - 2p

  2. i+2pki + 2p − k不能整除ss

      示意图
    卷积 理解CNN中的卷积和反卷积
    反卷积 理解CNN中的卷积和反卷积

    kk,ss,pp取值任意,且i+2pki+2p-kssaa的卷积所对应的反卷积参数为k=kk'=k,s=1s'=1,p=kp1p'=k-p-1,ii'尺寸为原输入每行每列间插入s1s-1个空行列,且在最下行和最右列初再加aa个空行列.

    o=s(i1)+a+k2p o' = s(i' − 1) + a + k - 2p

空洞卷积

理解CNN中的卷积和反卷积


  1. Dumoulin V , Visin F . A guide to convolution arithmetic for deep learning[J]. 2016. ↩︎

  2. 图片来源:https://github.com/vdumoulin/conv_arithmetic ↩︎

  3. 这里讨论的是CNN中的反卷积,不同于数学上的反卷积运算. ↩︎