簡單理解CNN的padding如何計算

簡單理解CNN的padding如何計算

一、說明

先看pytorch卷積層設置參數

nn.Conv2d(
in_channels=1,                  #input height
out_channels=16,                #n_filters
kernel_size=5,                  #卷積核
stride=1,                       #步長
padding=2                       #如果想要 con2d 出來的圖片長寬沒有變化, padding=(kernel_size-1)/2 當 stride=1
)

裏面有:

  • 輸入通道in_channels
  • 輸出通道out_channnels
  • 卷積核大小kernel_size
  • 步長stride
  • 填充值padding

爲了更好理解,我們搬出卷積神經網絡中的卷積掃描的原理,就是通過nxn的卷積核由左至右,由上到下,不斷掃描輸入圖像(彩色圖像就是三通像素值構成的),掃描塊的數值通過卷積計算得到一個新的值填入輸出圖中,這樣原來的圖像通過卷積操作就達到數據整理和過濾的效果的輸出圖像。下圖中,移動的跨度就是步長stride,原圖一個方向上的填充格就是填充值padding的兩倍,即2*padding(對稱填充,參數是這麼規定的),這樣我們就理解padding是怎麼來的了。
那麼,爲什麼要padding填充格子呢?
其實,填充格子的數值爲0,填充的目的是爲了儘量有效獲取邊緣信息,因爲如果padding=0,那麼越靠近邊緣的像素格掃描的次數越少,最少爲一次,這樣或許會丟失邊緣的重要信息。
在這裏插入圖片描述

二、計算

由卷積原理,我們知道原圖掃描過後,大小比原來似乎小了。但是也有輸出大小不變的時候,因爲有padding的存在(只要填充夠多,掃描次數等於原來圖像邊的格子數,根據具體情況考慮,盲目加padding沒有效果反而增加錯誤信息)。所以,padding有兩種屬性:(假設原圖大小HxW,卷積核大小k_hxk_w,填充值p,步長s,爲了便於理解這裏H=W,k_h=k_w)

  • padding=”VALID“,padding=0,指定屬性,不用設置padding,掃描後輸出圖像大小一定變小,
    輸出圖像的長=寬=H‘=[(H-k_h)/s+1]
    ([]是向上取整的意思,比如[22.5]=23,加1是爲了加上第一次掃描,加1放在取整裏和外面效果一樣)
  • padding=’'SAME“,這種屬性可以使輸入和輸出圖像的大小相同,特別是stride=1時
    輸出圖像的長=寬=H‘=[(H-k_h+2p)/s+1]
    還不明白的童鞋畫個圖比劃比劃就好理解了,這樣如果我要計算padding,那麼確定好原圖大小,卷積核大小,步長大小,只要計算出輸出圖大小,p就知道了
    p=[(H’-1)s-H+k_h]/2

三、技巧分享

1.如上,確定好原圖大小,卷積核大小,步長大小,只要計算出輸出圖大小,p就可以計算得到
2.如果想要卷積出來的圖片長寬沒有變化, p=(k_h-1)/2 僅當 stride=1的時候,可以簡單推導得到

以上爲個人整理總結的知識,如有遺漏或錯誤歡迎留言指出、點評,如要引用,請聯繫通知,未經允許謝絕轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章