反卷積的具體計算步驟
令圖像為

卷積核為

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:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNiZWdpbiU3QmFsaWduJTJBJTdEK2lucHV0XyU3QnBhZCU3RCslM0QrKyslNUNsZWZ0JTVCJTVDYmVnaW4lN0JhcnJheSU3RCU3QmNjY2NjJTdEKysrKysxKyUyNiswKyUyNisyKyUyNiswKyUyNiszKyU1QyU1QysrKysrMCslMjYrMCslMjYrMCslMjYrMCslMjYrMCslNUMlNUMrKysrKzQrJTI2KzArJTI2KzUrJTI2KzArJTI2KzYrJTVDJTVDKysrKyswKyUyNiswKyUyNiswKyUyNiswKyUyNiswKyU1QyU1QysrKysrNyslMjYrMCslMjYrOCslMjYrMCslMjYrOSslNUMlNUMrKyslNUNlbmQlN0JhcnJheSU3RCU1Q3JpZ2h0JTVEKyU1Q2VuZCU3QmFsaWduJTJBJTdE.png)
2. 接下來,用卷積核kernel對填充后的輸入inputpad進行步長stride=1的正向卷積,根據正向卷積輸出尺寸公式:
得到輸出尺寸是5x5,反卷積公式中我們給出的輸出尺寸參數output_shape也是為5,兩者相同,所以可以進行計算,結果為:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNiZWdpbiU3QmFsaWduJTJBJTdEK291dHB1dCslM0QrKyslNUNsZWZ0JTVCJTVDYmVnaW4lN0JhcnJheSU3RCU3QmNjY2NjJTdEKysrKysxKyUyNiswKyUyNisyKyUyNiswKyUyNiszKyU1QyU1QysrKysrMCslMjYrNislMjYrMCslMjYrOCslMjYrMCslNUMlNUMrKysrKzQrJTI2KzArJTI2KzUrJTI2KzArJTI2KzYrJTVDJTVDKysrKyswKyUyNisxMislMjYrMCslMjYrMTQrJTI2KzArJTVDJTVDKysrKys3KyUyNiswKyUyNis4KyUyNiswKyUyNis5KyU1QyU1QysrKyU1Q2VuZCU3QmFycmF5JTdEJTVDcmlnaHQlNUQrJTVDZW5kJTdCYWxpZ24lMkElN0Q=.png)
與 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:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNiZWdpbiU3QmFsaWduJTJBJTdEK2lucHV0KyUzRCsrKyU1Q2xlZnQlNUIlNUNiZWdpbiU3QmFycmF5JTdEJTdCY2NjY2NjY2MlN0QrKysrKysrKysrMCslMjYrMCslMjYrMCslMjYrMCslMjYrMCslMjYrMCslMjYrMCslNUMlNUMrKysrKyswKyUyNisxKyUyNiswKyUyNisyKyUyNiswKyUyNiszKyUyNiswKyU1QyU1QysrKysrKzArJTI2KzArJTI2KzArJTI2KzArJTI2KzArJTI2KzArJTI2KzArJTVDJTVDKysrKysrMCslMjYrNCslMjYrMCslMjYrNSslMjYrMCslMjYrNislMjYrMCslNUMlNUMrKysrKyswKyUyNiswKyUyNiswKyUyNiswKyUyNiswKyUyNiswKyUyNiswKyU1QyU1QysrKysrKzArJTI2KzcrJTI2KzArJTI2KzgrJTI2KzArJTI2KzkrJTI2KzArJTVDJTVDKysrKysrMCslMjYrMCslMjYrMCslMjYrMCslMjYrMCslMjYrMCslMjYrMCslNUMlNUMrKyslNUNlbmQlN0JhcnJheSU3RCU1Q3JpZ2h0JTVEKyU1Q2VuZCU3QmFsaWduJTJBJTdE.png)
這時發現,填充后的輸入尺寸與3x3的卷積核卷積后的輸出尺寸是5x5,沒有達到output_shape的6x6,這就需要繼續填充0,tensorflow 的計算規則是優先在左側和上側填充一排0,填充后的輸入變為:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNiZWdpbiU3QmFsaWduJTJBJTdEK2lucHV0KyUzRCsrKyU1Q2xlZnQlNUIlNUNiZWdpbiU3QmFycmF5JTdEJTdCY2NjY2NjY2MlN0QrKysrKzArJTI2KzArJTI2KzArJTI2KzArJTI2KzArJTI2KzArJTI2KzArJTI2KzArJTVDJTVDKysrKyswKyUyNiswKyUyNiswKyUyNiswKyUyNiswKyUyNiswKyUyNiswKyUyNiswKyU1QyU1QysrKysrMCslMjYrMCslMjYrMSslMjYrMCslMjYrMislMjYrMCslMjYrMyslMjYrMCslNUMlNUMrKysrKzArJTI2KzArJTI2KzArJTI2KzArJTI2KzArJTI2KzArJTI2KzArJTI2KzArJTVDJTVDKysrKyswKyUyNiswKyUyNis0KyUyNiswKyUyNis1KyUyNiswKyUyNis2KyUyNiswKyU1QyU1QysrKysrMCslMjYrMCslMjYrMCslMjYrMCslMjYrMCslMjYrMCslMjYrMCslMjYrMCslNUMlNUMrKysrKzArJTI2KzArJTI2KzcrJTI2KzArJTI2KzgrJTI2KzArJTI2KzkrJTI2KzArJTVDJTVDKysrKyswKyUyNiswKyUyNiswKyUyNiswKyUyNiswKyUyNiswKyUyNiswKyUyNiswKyU1QyU1QysrKyU1Q2VuZCU3QmFycmF5JTdEJTVDcmlnaHQlNUQrJTVDZW5kJTdCYWxpZ24lMkElN0Q=.png)
接下來,再對這個填充后的輸入與3x3的卷積核卷積,結果為:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNiZWdpbiU3QmFsaWduJTJBJTdEK2lucHV0KyUzRCsrKyU1Q2xlZnQlNUIlNUNiZWdpbiU3QmFycmF5JTdEJTdCY2NjY2NjJTdEKysrKysxKyUyNiswKyUyNisyKyUyNiswKyUyNiszKyUyNiswKyU1QyU1QysrKysrMCslMjYrMSslMjYrMCslMjYrMislMjYrMCslMjYrMyslNUMlNUMrKysrKzQrJTI2KzArJTI2KzYrJTI2KzArJTI2KzgrJTI2KzArJTVDJTVDKysrKyswKyUyNis0KyUyNiswKyUyNis1KyUyNiswKyUyNis2KyU1QyU1QysrKysrNyslMjYrMCslMjYrMTIrJTI2KzArJTI2KzE0KyUyNiswKyU1QyU1QysrKysrMCslMjYrNyslMjYrMCslMjYrOCslMjYrMCslMjYrOSslNUMlNUMrKyslNUNlbmQlN0JhcnJheSU3RCU1Q3JpZ2h0JTVEKyU1Q2VuZCU3QmFsaWduJTJBJTdE.png)
與 tensorflow 的運行結果相同。
參考資料:
