反卷積 轉置卷積

2021-08-26 05:12:01 字數 2027 閱讀 4310

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

第一次看到deconv這個詞,以為deconv的結果就是卷積的逆,覺得神奇,不禁產生了「哦?轉置的卷積就可以求逆了嗎?」這樣的想法,然後在matlab裡面實驗求證,我還記得當時以為反卷積能夠求逆,考慮到進行常規卷積操作輸出大小又不可能變大(same/valid),於是我還假設反卷積輸出大小不變,用了same padding和原核的轉置作為反卷積配置,結果發現根本不是那麼一回事好嗎。 

其實dl中的deconv,是一種上取樣過程,舉個比方:輸入 x∈r(4,4)矩陣,卷積核 w∈r(3,3),pad=0,stride=1的情況下(如下左圖),卷積的輸出 y∈r(2,2)。對 y進行deconv,它只能做到把還原輸出大小到和 x一樣大,輸出值和 x有那麼一點聯絡。 

所以啊deconv這個名字相當誤導人吶!這在cs231n課程裡也被吐槽過,大家現在更喜歡用transposed conv來表述反卷積。為了方便起見,後文就用反卷積這個詞了。

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

1)卷積  i=4,k=3,p=0,s=1,則 o=2

反卷積 i=2,k=3,p=0,s=1,則 o=4

注意圖中藍色(下面)是輸入,綠色(上面)是輸出,卷積和反卷積在 p、s、k 等引數一樣時,是相當於 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 卷積的情況。

然後就產生了第三個confuse:「補0了會不會有影響,還能通過反卷積近似輸入 x 嗎?」其實反卷積也不一定能達到近似的效果,影象裡的卷積,相當於一種相關操作,而反卷積維持了這種相關操作時的 w 與 x、與 y 之間的聯絡維持了。至於補0後操作是否還等價,上一段已經說明了是等價的,讀者可以在閱讀完後面的文章後自己嘗試一下。

卷積和反卷積的過程在arxiv-a guide to convolution arithmetic for deep learning

2寫的非常詳細,還有很多例子便於理解,在這裡我就截圖出重點來(ps.文中的figure2.1就是上圖的左邊)。剩下的例子請大家多看看原文,最好自己動手算一下,我也貼個我算的過程( ci 表示矩陣 c 的第 i 行),供參考。 

關於反向傳播, 知乎-如何理解深度學習中的deconvolution networks

3有詳細的推導過程。 

參考資料↩↩

轉置卷積 反卷積

借鑑於此個部落格,寫的非常好 轉置卷積 transposed convolution 也叫做反卷積 deconvolution pytorch中可以使用torch.nn.convtranspose2d 來呼叫,caffe中對應的轉置卷積層為deconv layer 作用 在 中用於對影象上取樣。操作...

反卷積層(轉置卷積)

反卷積 deconvolution 不是數字訊號處理裡面的意義,在深度學習裡面應該叫做轉置卷積 transposed convolution 又名微步卷積 fractionally strided convolutions 也有叫backward strided convolution upconv...

反卷積(轉置卷積)的理解

參考 開啟鏈結 就是這個圖啦,其中藍色部分是輸入的feature map,然後有3 3的卷積核在上面以步長為2的速度滑動,可以看到周圍還加里一圈padding,用更標準化的引數方式來描述這個過程 二維的離散卷積 n 2 方形的特徵輸入 i i i 方形的卷積核尺寸 k k k 每個維度相同的步長 s...