本文中關於卷積和反捲積內容主要參考論文《A guide to convolution arithmetic for deep learning》
卷積
一個2D卷積的示意圖如下(在實際CNN中,我們更常使用3D卷積,其卷積核是3D的):
有填充(zero paddind) |
無填充(no padding) |
|
|
各種形式的卷積算法
因爲在各個通道上的卷積是獨立的,因此在這裏我們就二維單通道卷積,討論各種參數下卷積.爲方便討論,做出如下假設:
- 輸入是正方形的(i1=i2=i)
- 卷積核是正方形的.(k1=k2=k)
- 兩個維度上的卷積步長相等(s1=s2=s)
- 兩個維度上的填充層數相同(p1=p2=p)
下面分別討論卷積參數i,k,p,s不同造成的卷積結果的不同:
|
|
|
|
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)與卷積正相反,可用於將卷積結果在尺寸上放大,實現上採樣(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
空洞卷積