反卷積的具體計算步驟
令圖像為
卷積核為
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 的運行結果相同。
參考資料: