參考:https://blog.csdn.net/qq_41368247/article/details/86626446
使用前提:stride > 1
補充:same卷積操作
是通過padding使得卷積之后輸出的特征圖大小保持不變(相對於輸入特征圖),不代表得到的輸出特征圖的大小與輸入特征圖的大小完全相同,而是他們之間的比例保持為 輸入特征圖大小/輸出特征圖大小 = stride
舉例:
比如輸入特征圖為6*6,stride=2, kernel_size = 3, 所以進行same卷機操作得輸出特征圖為3*3 (6/2 = 3)
如果輸入特征圖為5*5,stride=2,kernel_size = 3,這時候設置padding = 1,那么也會得到輸出特征圖為3*3
那么這樣的情況就會導致在逆卷積時出現一個問題。
問題:
問題就是,不同大小的圖片經過卷積運算能得到相同尺寸的輸出,那么作為逆運算,同樣的一張輸入圖像經過反卷積是否會有不同尺寸的合法輸出?這樣的話就存在爭議了
上面還只是進行same卷積的情況,如果考慮valid卷積,stride=2, kernel_size = 3,padding=0時,輸入特征圖為7*7和8*8的結果也是3*3
解決爭議的辦法就是使用output_padding參數
output_padding的作用是:
當stride > 1時,Conv2d將多個輸入形狀映射到相同的輸出形狀。output_padding通過在一邊有效地增加計算出的輸出形狀來解決這種模糊性。
首先我們要認同一個前提:
大多數情況下我們都希望經過卷積/反卷積處理后的圖像尺寸比例與步長相等,即輸入特征圖大小/輸出特征圖大小 = stride,也就是same模式。
所以我們只要通過添加output_padding這一參數來使得結果滿足這一前提,那么輸出的圖片的大小就能夠保證為輸入圖片*stride的大小,而不是任意可能的大小
實現辦法:
因為pytorch將參數padding(注意與output_padding區別)建議設置為(kernel_size - 1)/2,由式子padding= kernel - 1 - padding轉換而來
那么根據式子:
當我們希望得到輸入特征圖大小/輸出特征圖大小 = stride的話,代入上面的式子能夠得到結果:
padding = (kernel_size - stride + output_padding )/2
所以為了讓padding = (kernel_size - 1)/2,則output_padding應該取值為stride - 1,這樣就能夠滿足輸入特征圖大小/輸出特征圖大小 = stride
當然,你可以取別的值,這並不會影響到逆卷積的計算,但是在后面進行有關大小的操作時就很可能出現問題,因為輸出的圖片的大小並不能保證是 輸入圖片*stride的大小,可能是任意正確的大小,如上面舉的例子,可能是7*7或8*8等