[重點]轉置卷積的解釋,避免三個誤區: 點擊開啟連結
Y = CX 卷積操作矩陣C定義排列如下:
很多文章都說卷積核的轉置就可以求反卷積,又陷入迷茫“就算把卷積核轉置(或者左右翻轉上下翻轉),卷積後輸出還是越來越小(或不變,至少不會增大)啊”……直到看到文獻和相應的這個動畫(其他動畫在github-convolution arithmetic1)
| |
|
| 卷積 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,而是值卷積操作矩陣C的轉置。但如果將卷積計算寫成矩陣乘法(在程式中,為了提高卷積操作的效率,就可以這麼幹,比如tensorflow中就是這種實現), Y⃗ =CX⃗ (其中 Y⃗ 表示將 Y⃗ 拉成一維向量, X⃗ 同理),那麼反卷積確實可以表示為 CTY⃗ ,而這樣的矩陣乘法,恰恰等於 w 左右翻轉再上下翻轉後與補0的 Y 卷積的情況。具體看連結部落格
全文: Convolution Arithmetic Tutorial 點擊開啟連結
github上關於卷積與轉置卷積的動態圖 點擊開啟連結
結論: Quick reference
Convolution relationship
A convolution specified by input size , kernel size , stride , padding size ,
has an output size given by
In Theano, this translates to
output = theano.tensor.nnet.conv2d( input, filters, input_shape=(b, c2, i1, i2), filter_shape=(c1, c2, k1, k2), border_mode=(p1, p2), subsample=(s1, s2))# output.shape[2] == (i