1. 程式人生 > >深度學習 | 反捲積/轉置卷積 的理解 transposed conv/deconv

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

搞明白了卷積網路中所謂deconv到底是個什麼東西后,不寫下來怕又忘記,根據參考資料,加上我自己的理解,記錄在這篇部落格裡。

先來規範表達

  • 為了方便理解,本文出現的舉例情況都是2D矩陣卷積,卷積輸入和核形狀都為正方形,x和y軸方向的padding相同,stride也相同。
  • 記號:
    i,o,k,p,s 分別表示:卷積/反捲積的輸入大小inputsize,卷積/反捲積輸出大小outputsize,卷積/反捲積核大小kernelsizepaddingstride
  • 舉例(如下左圖):
    輸入
    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等引數一樣時,是相當於io 調了個位。
這裡說明了反捲積的時候,是有補0的,即使人家管這叫no paddingp=0),這是因為卷積的時候從藍色4×4 縮小為綠色2×2,所以對應的p=0 反捲積應該從藍色2×2 擴充套件成綠色4×4。而且轉置並不是指這個3×3 的核w 變為wT,但如果將卷積計算寫成矩陣乘法(在程式中,為了提高卷積操作的效率,就可以這麼幹,比如tensorflow中就是這種實現),