深度學習卷積網絡中反捲積/轉置卷積的理解 transposed conv/deconv

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

先來規範表達

  • 爲了方便理解,本文出現的舉例狀況都是2D矩陣卷積,卷積輸入和核形狀都爲正方形,x和y軸方向的padding相同,stride也相同。
  • 記號: 
     分別表示:卷積/反捲積的輸入大小 ,卷積/反捲積輸出大小 ,卷積/反捲積核大小  
  • 舉例(以下左圖): 
    輸入 矩陣,卷積核 的狀況下,卷積的輸出 ,就記爲  

推翻錯誤的理解

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

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

卷積 $\ padding=0,stride=1$ 反捲積$\ padding=0,stride=1$
卷積  反捲積

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

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


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

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

相關文章
相關標籤/搜索