nn.ConvTranspose2d的參數output_padding的作用


參考: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等


免責聲明!

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



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