反卷積(Transposed Convolution)


反卷積的具體計算步驟

令圖像為

 

卷積核為

 

 

 

case 1

如果要使輸出的尺寸是 5x5,步數 stride=2 ,tensorflow 中的命令為:

transpose_conv = tf.nn.conv2d_transpose(value=input, 
                                        filter=kernel, output_shape=[1,5,5,1], strides=2, padding='SAME')

當執行 transpose_conv 命令時,tensorflow 會先計算卷積類型、輸入尺寸、步數和輸出尺寸之間的關系是否成立,如果不成立,會直接提示錯誤,如果成立,執行如下操作:

1. 現根據步數strides對輸入的內部進行填充,這里strides可以理解成輸入放大的倍數,即在input的每個元素之間填充 0,0的個數n與strides的關系為:n=strides-1

例如這里舉例的strides=2,即在input的每個元素之間填1個0:

[公式]

2. 接下來,用卷積核kernel對填充后的輸入inputpad進行步長stride=1的正向卷積,根據正向卷積輸出尺寸公式: [公式] 得到輸出尺寸是5x5,反卷積公式中我們給出的輸出尺寸參數output_shape也是為5,兩者相同,所以可以進行計算,結果為:

[公式]

與 tensorflow 的運行結果相同。

case 2

我們將 case 1 中的輸出尺寸output_shape改成6,其他參數均不變,tensorflow 中的命令為:

transpose_conv = tf.nn.conv2d_transpose(value=input, 
                                        filter=kernel, output_shape=[1,6,6,1], strides=2, padding='SAME')

卷積類型是 same,我們首先在外圍填充一圈0:

[公式]

這時發現,填充后的輸入尺寸與3x3的卷積核卷積后的輸出尺寸是5x5,沒有達到output_shape的6x6,這就需要繼續填充0,tensorflow 的計算規則是優先在左側和上側填充一排0,填充后的輸入變為:

[公式]

接下來,再對這個填充后的輸入與3x3的卷積核卷積,結果為:

[公式]

與 tensorflow 的運行結果相同。

 

參考資料:

https://zhuanlan.zhihu.com/p/48501100


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM