1. 程式人生 > >反捲積(轉置卷積)

反捲積(轉置卷積)

轉置卷積其實就相當於正常卷積的反向傳播。

考慮一個輸入為x=4x4,卷積核為w=3x3,步長為stride=1zero-padding=0

將卷積核展開為一個稀疏矩陣C


做卷積可得2x2的輸出yC*x=y。如下圖所示:

 

那麼怎麼得到轉置卷積呢。正如我們上面說的轉置卷積其實就相當於正常卷積的反向傳播。

再對上式求輸入x的梯度:

 

我們可以發現,在反向傳播過程中梯度從高層傳向底層,正好是來自高層的梯度左乘CT。所以我們要從2x2的輸入y得到4x4的輸出,只要:CT*y

但是要注意的一點,轉置卷積只是恢復了其形狀,並未對其值進行恢復,這也是為什麼將其稱為反捲積不合適的原因了。

其實在

tensorflo中實現轉置卷積也是利用了這個性質。

另一種實現轉置卷積操作的方法是對輸入的feature map進行zero-padding,在進行正常的卷積操作就可以實現轉置卷積:

 

但是這種操作相對於上面一種有一個缺點,對一個map進行轉置卷積往往需要對其進行很多行和列的padding,所以效率相對較低。

最後需要注意的,轉置卷積和訊號處理中的反捲積是有差別,並不是卷積的反操作。

如果你不理解轉置卷積,你可以這樣去設定引數,比如,現在你需要從一個nxnmap轉置卷積到一個mxmmap,你不知道怎麼設定它的卷積核大小,paddingstrides,這個時候你可以反過來考慮怎麼從mxm

正常卷積到nxnmap兩者的引數是一樣的。你定義一個卷積核,決定其進行卷積操作還是轉置卷積,只是看你是左乘C還是CT

參考資料:A guide to convolution arithmetic for deep learning

https://www.zhihu.com/question/43609045?rf=53910187