卷積核移動的步長(stride)小於卷積核的邊長(通常爲正方行)時,變會出現卷積核與原始輸入矩陣做用範圍在區域上的重疊(overlap),卷積核移動的步長(stride)與卷積核的邊長相一致時,不會出現重疊現象。html
反捲積(Deconvolution)的概念第一次出現是Zeiler在2010年發表的論文
Deconvolutional networks中,可是並無指定反捲積這個名字,反捲積這個術語正式的使用是在其以後的工做中(
Adaptive deconvolutional networks for mid and high level feature learning)。隨着反捲積在神經網絡可視化上的成功應用,其被愈來愈多的工做所採納好比:場景分割、生成模型等。其中反捲積(Deconvolution)也有不少其餘的叫法,好比:Transposed Convolution,Fractional Strided Convolution等等。
這篇文章的目的主要有兩方面:
1. 解釋卷積層和反捲積層之間的關係;
2. 弄清楚反捲積層輸入特徵大小和輸出特徵大小之間的關係。
## 卷積層
卷積層你們應該都很熟悉了,爲了方便說明,定義以下:
- 二維的離散卷積(
N=2
N=2)
- 方形的特徵輸入(
i1=i2=i
i1=i2=i)
- 方形的卷積核尺寸(
k1=k2=k
k1=k2=k)
- 每一個維度相同的步長(
s1=s2=s
s1=s2=s)
- 每一個維度相同的padding (
p1=p2=p
p1=p2=p)
下圖表示參數爲
(i=5,k=3,s=2,p=1)
(i=5,k=3,s=2,p=1) 的卷積計算過程,從計算結果能夠看出輸出特徵的尺寸爲
(o1=o2=o=3)
(o1=o2=o=3)。
下圖表示參數爲
(i=6,k=3,s=2,p=1)
(i=6,k=3,s=2,p=1) 的卷積計算過程,從計算結果能夠看出輸出特徵的尺寸爲
(o1=o2=o=3)
(o1=o2=o=3)。
從上述兩個例子咱們能夠總結出卷積層輸入特徵與輸出特徵尺寸和卷積核參數的關係爲:
o=⌊i+2p−ks⌋+1.
o=⌊i+2p−ks⌋+1.
其中
⌊x⌋
⌊x⌋ 表示對
x
x 向下取整。
反捲積層
在介紹反捲積以前,咱們先來看看卷積運算和矩陣運算之間的關係。
卷積和矩陣相乘
考慮以下一個簡單的卷積層運算,其參數爲
(i=4,k=3,s=1,p=0)
(i=4,k=3,s=1,p=0),輸出
o=2
o=2。
對於上述卷積運算,咱們把上圖所示的3×3卷積核展成一個以下所示的[4,16]的稀疏矩陣
C
C, 其中非0元素
wi,j
wi,j 表示卷積核的第
i
i 行和第
j
j 列。
⎛⎝⎜⎜⎜⎜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⎞⎠⎟⎟⎟⎟
(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)
咱們再把4×4的輸入特徵展成[16,1]的矩陣
X
X,那麼
Y=CX
Y=CX 則是一個[4,1]的輸出特徵矩陣,把它從新排列2×2的輸出特徵就獲得最終的結果,從上述分析能夠看出卷積層的計算實際上是能夠轉化成矩陣相乘的。值得注意的是,在一些深度學習網絡的開源框架中並非經過這種這個轉換方法來計算卷積的,由於這個轉換會存在不少無用的0乘操做,Caffe中具體實現卷積計算的方法可參考Implementing convolution as a matrix multiplication。
經過上述的分析,咱們已經知道卷積層的前向操做能夠表示爲和矩陣
C
C相乘,那麼 咱們很容易獲得卷積層的反向傳播就是和
C
C的轉置相乘。
反捲積和卷積的關係
全面咱們已經說過反捲積又被稱爲Transposed(轉置) Convolution,咱們能夠看出其實卷積層的前向傳播過程就是反捲積層的反向傳播過程,卷積層的反向傳播過程就是反捲積層的前向傳播過程。由於卷積層的前向反向計算分別爲乘
C
C 和
CT
CT,而反捲積層的前向反向計算分別爲乘
CT
CT 和
(CT)T
(CT)T ,因此它們的前向傳播和反向傳播恰好交換過來。
下圖表示一個和上圖卷積計算對應的反捲積操做,其中他們的輸入輸出關係正好相反。若是不考慮通道以卷積運算的反向運算來計算反捲積運算的話,咱們還能夠經過離散卷積的方法來求反捲積(這裏只是爲了說明,實際工做中不會這麼作)。
一樣爲了說明,定義反捲積操做參數以下:
- 二維的離散卷積(
N=2
N=2)
- 方形的特徵輸入(
i′1=i′2=i′
i1′=i2′=i′)
- 方形的卷積核尺寸(
k′1=k′2=k′
k1′=k2′=k′)
- 每一個維度相同的步長(
s′1=s′2=s′
s1′=s2′=s′)
- 每一個維度相同的padding (
p′1=p′2=p′
p1′=p2′=p′)
下圖表示的是參數爲(
i′=2,k′=3,s′=1,p′=2
i′=2,k′=3,s′=1,p′=2)的反捲積操做,其對應的卷積操做參數爲
(i=4,k=3,s=1,p=0)
(i=4,k=3,s=1,p=0)。咱們能夠發現對應的卷積和非卷積操做其
(k=k′,s=s′)
(k=k′,s=s′),可是反捲積卻多了
p′=2
p′=2。經過對比咱們能夠發現卷積層中左上角的輸入只對左上角的輸出有貢獻,因此反捲積層會出現
p′=k−p−1=2
p′=k−p−1=2。經過示意圖,咱們能夠發現,反捲積層的輸入輸出在
s=s′=1
s=s′=1 的狀況下關係爲:
o′=i′−k′+2p′+1=i′+(k−1)−2p
o′=i′−k′+2p′+1=i′+(k−1)−2p
Fractionally Strided Convolution
上面也提到過反捲積有時候也被叫作Fractionally Strided Convolution,翻譯過來大概意思就是小數步長的卷積。對於步長
s>1
s>1的卷積,咱們可能會想到其對應的反捲積步長
s′<1
s′<1。 以下圖所示爲一個參數爲
i=5,k=3,s=2,p=1
i=5,k=3,s=2,p=1的卷積操做(就是第一張圖所演示的)所對應的反捲積操做。對於反捲積操做的小數步長咱們能夠理解爲:在其輸入特徵單元之間插入
s−1
s−1 個0,插入0後把其看出是新的特徵輸入,而後此時步長
s′
s′ 再也不是小數而是爲1。所以,結合上面所獲得的結論,咱們能夠得出Fractionally Strided Convolution的輸入輸出關係爲:
o′=s(i′−1)+k−2p
o′=s(i′−1)+k−2p
參考
conv_arithmetic
Is the deconvolution layer the same as a convolutional layer?