CNN中stride(步幅)和padding(填充)的详细理解

步幅:卷积核经过输入特征图的采样间隔

填充:在输入特征图的每一边添加一定数目的行列,使得输出的特征图的长、宽 = 输入的特征图的长、宽

两个参数的核心:

设置步幅的目的:希望减小输入参数的数目,减少计算量

设置填充的目的:希望每个输入方块都能作为卷积窗口的中心

在边长=4的输入矩阵各边填充1层,全部填充0,采用边长=3的卷积核,全部卷积核的中心构成原输入

首先从一个问题入手:

问题:一个尺寸 a*a 的特征图,经过 b*b 的卷积层,步幅(stride)=c,填充(padding)=d,
      请计算出输出的特征图尺寸?


答:若d等于0,也就是不填充,输出的特征图的尺寸=(a-b)/c+1
       若d不等于0,也就是填充,输出的特征图的尺寸=(a+2d-b)/c+1
    
 

举栗子:
栗子1:stride=1,padding=0(遍历采样,无填充:padding=‘valid’)
栗子2:stride=1,padding=1(遍历采样,有填充:padding=‘same’)
栗子3:stride=2,padding=0(降采样,无填充:尺寸缩小二点五分之一)
栗子4:stride=2,padding=1(降采样,有填充;尺寸缩小二分之一)

Stride的作用:是成倍缩小尺寸,而这个参数的值就是缩小的具体倍数,比如步幅为2,输出就是输入的1/2;步幅为3,输出就是输入的1/3

注意:
上面的说法(步幅为2,输出就是输入的1/2;步幅为3,输出就是输入的1/3)不是很严谨,这不是定理来的,步幅为2可以理解成对输入的特征图做了2倍下采样,我们希望的是减少输入参数,防止参数太多计算量太大,这是设置步幅为2的目的,并不是严格意义上的输出是输入的1/2、1/3,这里要特别弄清楚

动图中下图是输入图像尺寸,上图是卷积后的特征图尺寸,下图中的移动阴影是卷积核尺寸

 栗子1:  一个特征图尺寸为4*4的输入,使用3*3的卷积核,步幅=1,填充=0
        输出的尺寸=(4 - 3)/1 + 1 = 2

栗子2:  一个特征图尺寸为5*5的输入,使用3*3的卷积核,步幅=1,填充=1
        输出的尺寸=(5 + 2*1 - 3)/1 + 1 = 5

栗子3:  一个特征图尺寸为5*5的输入, 使用3*3的卷积核,步幅=2,填充=0
         输出的尺寸=(5-3)/2 + 1 = 2

栗子4:  一个特征图尺寸为6*6的输入, 使用3*3的卷积核,步幅=2,填充=1
         输出的尺寸=(6 + 2*1 - 3)/2 + 1 = 2.5 + 1 = 3.5 向下取整=3
         (降采样:边长减少1/2)

看代码时注意:

看到stride


步幅 stride 是一个一维的向量,长度为4。
形式是[a,x,y,z],分别代表[batch滑动步长,水平滑动步长,垂直滑动步长,通道滑动步长]

在tensorflow中,stride的一般形式是[1,x,y,1]

第一个1表示:在batch维度上的滑动步长为1,即不跳过任何一个样本

x表示:卷积核的水平滑动步长

y表示:卷积核的垂直滑动步长

最后一个1表示:在通道维度上的滑动步长为1,即不跳过任何一个颜色通道

在代码中多数看到的是 strides=[1,1,1,1] 或者 strides=[1,2,2,1]

这里的 strides=[1,1,1,1] 表示就是栗子1、2图示步幅=1的情况
这里的 strides=[1,2,2,1] 表示就是栗子3、4图示步幅=2的情况

看到padding


写代码时,要注意,padding有两个模式,分别是 `same` 和 `valid` , 

`padding='same'`表示进行填充,填充的值由算法内部根据卷积核大小计算,目的是让输出尺寸和输入相等;
`padding='valid'`表示不进行填充,即是 padding=0,只使用有效的窗口位置,这是默认的选项。

填充的值=(b - 1)/2       
填充的值,b的值就是卷积核的尺寸,这里就是为什么卷积核尺寸通常选择奇数的原因

举例子:
问题1.  一个尺寸 5*5 的特征图,经过 3*3 的卷积层,步幅(stride)=1,想要输出尺寸和输入尺寸相等,填充(padding)的值应该等于多少?
       答:填充的值=(3 - 1)/2 = 1,即每一边填充1层

问题2.  一个尺寸 224*224 的特征图,经过 7*7 的卷积层,步幅(stride)=2,想要实现2倍下采样,填充(padding)的值应该等于多少?
       答:填充的值=(7 - 1)/2 = 3,即每一边填充3层
       输出的尺寸=(224 + 2*3 - 7)/2 + 1 = 111.5 + 1 = 112.5 向下取整=112
       (降采样:边长减少1/2)

还要注意:


padding='same' 目的是让输出尺寸和输入尺寸相等,但前提是步幅=1,步幅若不是1,那么输出尺寸跟输入尺寸肯定是不一样

对于 padding 的 same 和 valid 模式两种直白的理解就是要么不填充,要么填充就让输出尺寸和输入尺寸相等
padding 的值不会乱取,就两种情况,要么padding=0 要么padding=(b - 1)/2

  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值