理解CNN中的卷积和反卷积

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

卷积

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

在这里插入图片描述

有填充(zero paddind)无填充(no padding)
在这里插入图片描述在这里插入图片描述

各种形式的卷积算法

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

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

下面分别讨论卷积参数 i i i, k k k, p p p, s s s不同造成的卷积结果的不同2:

No padding, no stridesArbitrary padding, no stridesHalf padding, no stridesFull padding, no strides
No padding, stridesPadding, stridesPadding, strides (odd)

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

在这里插入图片描述

i i i, k k k取值任意, s = 1 s=1 s=1, p = 0 p=0 p=0的情况下:

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

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

在这里插入图片描述

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

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

  1. half (same) padding

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

    在这里插入图片描述

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

  2. full padding

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

    在这里插入图片描述

    i i i k k k取值任意, p = k − 1 p=k-1 p=k1 s = 1 s=1 s=1的情况下:

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

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

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

在这里插入图片描述

i i i k k k取值任意, p = k − 1 p=k-1 p=k1 s = 1 s=1 s=1的情况下:

o = ⌊ i − k s ⌋ + 1 o = \left\lfloor \frac{i-k}{s} \right\rfloor + 1 o=sik+1

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

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

在这里插入图片描述

在这里插入图片描述

i i i, k k k, p p p s s s取值任意的情况下:

o = ⌊ i + 2 p − k s ⌋ + 1 o = \left\lfloor \frac{i+2p-k}{s} \right\rfloor + 1 o=si+2pk+1

反卷积(transposed convolution, deconvolution)

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

反卷积的数学证明

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

在这里插入图片描述

先分别将输入 i n p u t input input和输出 o u t p u t output output分别展开为列向量 X X X Y Y Y:
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 \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} XY=[x1x2x3x4x5x6x7x8x9x10x11x12x13x14x15x16]T=[y1y2y3y4]T
构造矩阵 C C C
C = [ 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 ] 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} 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 = C X Y = C X Y=CX
卷积运算的反向传播计算公式为
∂ J ∂ X = ∂ J ∂ Y C T \frac{\partial{J}}{\partial{X}} = \frac{\partial{J}}{\partial{Y}} C^T XJ=YJCT


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

使用卷积实现反卷积

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

No padding, no strides, transposedArbitrary padding, no strides, transposedHalf padding, no strides, transposedFull padding, no strides, transposed
No padding, strides, transposedPadding, strides, transposedPadding, strides, transposed (odd)

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

 示意图
卷积在这里插入图片描述
反卷积在这里插入图片描述

i i i k k k取值任意, s = 1 s=1 s=1, p = 0 p=0 p=0的卷积所对应的反卷积参数为 k ′ = k k'=k k=k, s ′ = s s'=s s=s, p ′ = k − 1 p'=k-1 p=k1

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

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

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

 示意图
卷积在这里插入图片描述
反卷积在这里插入图片描述

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

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

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

     示意图
    卷积在这里插入图片描述
    反卷积在这里插入图片描述

    k k k为奇数( k = 2 n + 1 , n ∈ N k=2n+1, n \in \mathbb{N} k=2n+1,nN), s = 1 s=1 s=1, p = ⌊ k / 2 ⌋ = n p= \lfloor k/2 \rfloor = n p=k/2=n的卷积所对应的反卷积参数为 k ′ = k k'=k k=k, s ′ = s s'=s s=s, p ′ = p p'=p p=p
    o ′ = i ′ + ( k − 1 ) − 2 ⌊ k / 2 ⌋ = i + 2 n − 2 n = i o' = i' + (k − 1) - 2 \lfloor k/2 \rfloor = i + 2n − 2n = i o=i+(k1)2k/2=i+2n2n=i

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

  2. full padding卷积的反卷积

     示意图
    卷积在这里插入图片描述
    反卷积在这里插入图片描述

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

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

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

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

 示意图
卷积在这里插入图片描述
反卷积在这里插入图片描述

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

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

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

  1. i + 2 p − k i + 2p − k i+2pk能够整除 s s s

     示意图
    卷积在这里插入图片描述
    反卷积在这里插入图片描述

    k k k, s s s, p p p取值任意,且 i + 2 p − k i+2p-k i+2pk s s s的整数倍的卷积所对应的反卷积参数为 k ′ = k k'=k k=k, s ′ = 1 s'=1 s=1, p ′ = k − p − 1 p'=k-p-1 p=kp1, i ′ i' i尺寸为原输入每行每列间插入 s − 1 s-1 s1个空行列.

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

  2. i + 2 p − k i + 2p − k i+2pk不能整除 s s s

     示意图
    卷积在这里插入图片描述
    反卷积在这里插入图片描述

    k k k, s s s, p p p取值任意,且 i + 2 p − k i+2p-k i+2pk s s s a a a的卷积所对应的反卷积参数为 k ′ = k k'=k k=k, s ′ = 1 s'=1 s=1, p ′ = k − p − 1 p'=k-p-1 p=kp1, i ′ i' i尺寸为原输入每行每列间插入 s − 1 s-1 s1个空行列,且在最下行和最右列初再加 a a a个空行列.

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

空洞卷积

在这里插入图片描述


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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值