CNN中stride(步幅)和padding(填充)的详细理解 您所在的位置:网站首页 填充为蓝色该如何操作 CNN中stride(步幅)和padding(填充)的详细理解

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

2024-06-30 21:33| 来源: 网络整理| 查看: 265

网上一些解释,我觉还是有点不全面,我梳理一手:

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

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

两个参数的核心: 设置步幅的目的:希望减小输入参数的数目,减少计算量 设置填充的目的:希望每个输入方块都能作为卷积窗口的中心

在边长=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

参考文章:

【1】 tensorflow中步长stride的参数具体解析

【2】 CNN基础知识——卷积(Convolution)、填充(Padding)、步长(Stride)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有