简单理解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的时候,可以简单推导得到

以上为个人整理总结的知识,如有遗漏或错误欢迎留言指出、点评,如要引用,请联系通知,未经允许谢绝转载。

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