理解CNN中的卷積和反捲積

本文中關於卷積和反捲積內容主要參考論文《A guide to convolution arithmetic for deep learning》1

卷積

一個2D卷積的示意圖如下(在實際CNN中,我們更常使用3D卷積,其卷積核是3D的):

在這裏插入圖片描述

有填充(zero paddind) 無填充(no padding)
在這裏插入圖片描述 在這裏插入圖片描述

各種形式的卷積算法

因爲在各個通道上的卷積是獨立的,因此在這裏我們就二維單通道卷積,討論各種參數下卷積.爲方便討論,做出如下假設:

  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:

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)卷積

在這裏插入圖片描述

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

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

有填充,單位步長(zero padding, unit strides)卷積

在這裏插入圖片描述

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

根據pp的取值,有以下兩種特殊的padding::

  1. half (same) padding

    half (same) padding下,輸入與輸出的尺寸相同.

    在這裏插入圖片描述

    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下,輸入的每個像素都參與了同樣次數的卷積

    在這裏插入圖片描述

    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)運算

在這裏插入圖片描述

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)卷積

這是卷積運算的最一般形式,下面兩個示意圖分別展示最後一次卷積接觸到和未接觸到輸入的末尾的情況:

在這裏插入圖片描述

在這裏插入圖片描述

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).

反捲積的數學證明

要理解反捲積,首先卷積是如何實現的,卷積在數學上實際是通過矩陣乘法實現的,對於下述卷積,我們將其表示成矩陣運算的形式:

在這裏插入圖片描述

先分別將輸入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

使用卷積實現反捲積

卷積和反捲積在數學上都是用矩陣運算實現的,因此,每個反捲積運算都可以用對應的卷積運算來表示,下面分析各種反捲積運算的卷積形式.

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)卷積的反捲積

  示意圖
卷積 在這裏插入圖片描述
反捲積 在這裏插入圖片描述

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)卷積的反捲積

  示意圖
卷積 在這裏插入圖片描述
反捲積 在這裏插入圖片描述

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卷積的反捲積

      示意圖
    卷積 在這裏插入圖片描述
    反捲積 在這裏插入圖片描述

    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卷積的反捲積

      示意圖
    卷積 在這裏插入圖片描述
    反捲積 在這裏插入圖片描述

    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,這樣就實現了分數步長卷積.

  示意圖
卷積 在這裏插入圖片描述
反捲積 在這裏插入圖片描述

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

      示意圖
    卷積 在這裏插入圖片描述
    反捲積 在這裏插入圖片描述

    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

      示意圖
    卷積 在這裏插入圖片描述
    反捲積 在這裏插入圖片描述

    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

空洞卷積

在這裏插入圖片描述


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

  2. 圖片來源:https://github.com/vdumoulin/conv_arithmetic ↩︎

  3. 這裏討論的是CNN中的反捲積,不同於數學上的反捲積運算. ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章