【神經網絡與深度學習】卷積與反捲積

這裏寫圖片描述 

1. 卷積與反捲積

如上圖演示了卷積核反捲積的過程,定義輸入矩陣爲  I 4×4 ),卷積核爲  K 3×3 ),輸出矩陣爲  O 2×2 ):css

  • 卷積的過程爲: Conv(I,W)=O
  • 反捲積的過稱爲: Deconv(W,O)=I (須要對此時的  O  的邊緣進行延拓 padding

2. 步長與重疊

卷積核移動的步長(stride)小於卷積核的邊長(通常爲正方行)時,變會出現卷積核與原始輸入矩陣做用範圍在區域上的重疊(overlap),卷積核移動的步長(stride)與卷積核的邊長相一致時,不會出現重疊現象。html

4×4  的輸入矩陣  I 和  3×3  的卷積核 K git

  • 在步長(stride)爲 1 時,輸出的大小爲  (43+1)×(43+1)

現考慮其逆問題,原始輸入矩陣爲多大時,其與  3×3  的卷積核 K  相卷積獲得的輸出矩陣的大小爲  4×4 github

  • 步長(stride)爲 1 時, (x3+1)×(x3+1)=4×4  
    • x=6

搞明白了卷積網絡中所謂deconv究竟是個什麼東西后,不寫下來怕又忘記,根據參考資料,加上我本身的理解,記錄在這篇博客裏。c#

先來規範表達

  • 爲了方便理解,本文出現的舉例狀況都是2D矩陣卷積,卷積輸入和核形狀都爲正方形,x和y軸方向的padding相同,stride也相同。
  • 記號: 
     i,o,k,p,s  分別表示:卷積/反捲積的輸入大小  input size ,卷積/反捲積輸出大小  output size ,卷積/反捲積核大小  kernel size  padding  stride  。
  • 舉例(以下左圖): 
    輸入  XR(4,4) 矩陣,卷積核  wR(3,3)padding=0stride=1 的狀況下,卷積的輸出  YR(2,2) ,就記爲  i=4,o=2,k=3,p=0,s=1  。

推翻錯誤的理解

第一次看到deconv這個詞,覺得deconv的結果就是卷積的逆,以爲神奇,不由產生了「哦?轉置的卷積就能夠求逆了嗎?」這樣的想法,而後在matlab裏面實驗求證,我還記得當時覺得反捲積可以求逆,考慮到圖片進行常規卷積操做輸出大小又不可能變大(same/valid),因而我還假設反捲積輸出大小不變,用了same padding和原核的轉置做爲反捲積配置,結果發現根本不是那麼一回事好嗎。 
其實DL中的deconv,是一種上採樣過程,舉個比方:輸入  XR(4,4) 矩陣,卷積核  wR(3,3)pad=0stride=1 的狀況下(以下左圖),卷積的輸出  YR(2,2) 。對  Y 進行deconv,它只能作到把還原輸出大小到和  X 同樣大,輸出值和  X 有那麼一點聯繫。 
因此啊deconv這個名字至關誤導人吶!這在cs231n課程裏也被吐槽過,你們如今更喜歡用transposed conv來表述反捲積。爲了方便起見,後文就用反捲積這個詞了。網絡

第二個容易confused的地方,就是不少文章都說卷積核的轉置就能夠求反捲積,又陷入迷茫「就算把卷積核轉置(或者左右翻轉上下翻轉),卷積後輸出仍是愈來愈小(或不變,至少不會增大)啊」……直到看到文獻和相應的這個動畫(其餘動畫在github-convolution arithmetic1框架

卷積 $\ padding=0,stride=1$ 反捲積$\ padding=0,stride=1$
卷積   i=4,k=3,p=0,s=1, o=2 反捲積  i=2,k=3,p=0,s=1, o=4

注意圖中藍色(下面)是輸入,綠色(上面)是輸出,卷積和反捲積在  psk  等參數同樣時,是至關於  i  和  o  調了個位。 
這裏說明了反捲積的時候,是有補0的,即便人家管這叫no padding  p=0 ),這是由於卷積的時候從藍色  4×4  縮小爲綠色  2×2 ,因此對應的  p=0  反捲積應該從藍色  2×2  擴展成綠色  4×4 。並且轉置並非指這個  3×3  的核  w  變爲  wT ,但若是將卷積計算寫成矩陣乘法(在程序中,爲了提升卷積操做的效率,就能夠這麼幹,好比tensorflow中就是這種實現),  Y⃗ =CX⃗  (其中  Y⃗   表示將  Y⃗   拉成一維向量,  X⃗   同理),那麼反捲積確實能夠表示爲  CTY⃗  ,而這樣的矩陣乘法,偏偏等於  w  左右翻轉再上下翻轉後與補0的  Y  卷積的狀況。ide

而後就產生了第三個confuse:「補0了會不會有影響,還能經過反捲積近似輸入  X  嗎?」其實反捲積也不必定能達到近似的效果,圖像裏的卷積,至關於一種相關操做,而反捲積維持了這種相關操做時的  w  與  X 、與  Y  之間的聯繫維持了。至於補0後操做是否還等價,上一段已經說明了是等價的,讀者能夠在閱讀完後面的文章後本身嘗試一下。post


反捲積以及反向傳播的過程

卷積和反捲積的過程在arXiv-A guide to convolution arithmetic for deep learning2寫的很是詳細,還有不少例子便於理解,在這裏我就截圖出重點來(ps.文中的figure2.1就是上圖的左邊)。剩下的例子請你們多看看原文,最好本身動手算一下,我也貼個我算的過程(  Ci  表示矩陣  C  的第  i  行),供參考。 
關於反向傳播, 知乎-如何理解深度學習中的deconvolution networks3有詳細的推導過程。 
這裏寫圖片描述 
這裏寫圖片描述
這裏寫圖片描述 
這裏寫圖片描述 
這裏寫圖片描述學習


參考資料

Transposed Convolution, Fractionally Strided Convolution or Deconvolution






反捲積(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+2pks+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
  • 方形的特徵輸入( 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=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=kp1=2 p′=k−p−1=2。經過示意圖,咱們能夠發現,反捲積層的輸入輸出在  s=s=1 s=s′=1 的狀況下關係爲:

o=ik+2p+1=i+(k1)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的卷積操做(就是第一張圖所演示的)所對應的反捲積操做。對於反捲積操做的小數步長咱們能夠理解爲:在其輸入特徵單元之間插入  s1 s−1 個0,插入0後把其看出是新的特徵輸入,而後此時步長  s s′ 再也不是小數而是爲1。所以,結合上面所獲得的結論,咱們能夠得出Fractionally Strided Convolution的輸入輸出關係爲:

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



參考

conv_arithmetic

Is the deconvolution layer the same as a convolutional layer?

相關文章
相關標籤/搜索