深度學習 | 反捲積/轉置卷積 的理解 transposed conv/deconv
阿新 • • 發佈:2019-02-06
搞明白了卷積網路中所謂deconv到底是個什麼東西后,不寫下來怕又忘記,根據參考資料,加上我自己的理解,記錄在這篇部落格裡。
先來規範表達
- 為了方便理解,本文出現的舉例情況都是2D矩陣卷積,卷積輸入和核形狀都為正方形,x和y軸方向的padding相同,stride也相同。
- 記號:
分別表示:卷積/反捲積的輸入大小,卷積/反捲積輸出大小,卷積/反捲積核大小,, 。 - 舉例(如下左圖):
輸入
推翻錯誤的理解
第一次看到deconv這個詞,以為deconv的結果就是卷積的逆,覺得神奇,不禁產生了“哦?轉置的卷積就可以求逆了嗎?”這樣的想法,然後在matlab裡面實驗求證,我還記得當時以為反捲積能夠求逆,考慮到圖片進行常規卷積操作輸出大小又不可能變大(same/valid),於是我還假設反捲積輸出大小不變,用了same padding和原核的轉置作為反捲積配置,結果發現根本不是那麼一回事好嗎。
其實DL中的deconv,是一種上取樣過程,舉個比方:輸入 矩陣,卷積核的情況下(如下左圖),卷積的輸出。對進行deconv,它只能做到把還原輸出大小到和一樣大,輸出值和有那麼一點聯絡。
所以啊deconv這個名字相當誤導人吶!這在cs231n課程裡也被吐槽過,大家現在更喜歡用transposed conv來表述反捲積。為了方便起見,後文就用反捲積這個詞了。
第二個容易confused的地方,就是很多文章都說卷積核的轉置就可以求反捲積,又陷入迷茫“就算把卷積核轉置(或者左右翻轉上下翻轉),卷積後輸出還是越來越小(或不變,至少不會增大)啊
卷積 | 反捲積 |
注意圖中藍色(下面)是輸入,綠色(上面)是輸出,卷積和反捲積在等引數一樣時,是相當於 和 調了個位。
這裡說明了反捲積的時候,是有補0的,即使人家管這叫no padding(),這是因為卷積的時候從藍色 縮小為綠色,所以對應的 反捲積應該從藍色 擴充套件成綠色。而且轉置並不是指這個 的核 變為,但如果將卷積計算寫成矩陣乘法(在程式中,為了提高卷積操作的效率,就可以這麼幹,比如tensorflow中就是這種實現),