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

article/2025/10/2 8:29:08

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

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

两个参数的核心:

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

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

在边长=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 4*4 44的输入,使用 3 ∗ 3 3*3 33的卷积核,步幅=1,填充=0,输出的尺寸=(4 - 3)/1 + 1 = 2。

在这里插入图片描述

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

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

栗子4:
一个特征图尺寸为 6 ∗ 6 6*6 66的输入, 使用 3 ∗ 3 3*3 33的卷积核,步幅=2,填充=1, 输出的尺寸=(5 + 2*1 - 3)/2 + 1 = 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,想要输出尺寸和输入尺寸相等,填充(padding)的值应该等于多少?答:填充的值=(7 - 1)/2 = 3,即每一边填充3层

还要注意:

padding='same'目的是让输出尺寸和输入尺寸相等,但前提是步幅=1,步幅若不是1,那么输出尺寸跟输入尺寸肯定是不一样。对于 padding 的 same 和 valid 模式两种直白的理解就是要么不填充,要么填充就让输出尺寸和输入尺寸相等
padding 的值不会乱取,就两种情况,要么padding=0 要么padding=(b - 1)/2。

参考文章:

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

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


http://chatgpt.dhexx.cn/article/qVqKW6B4.shtml

相关文章

java输出(java输出语句快捷键)

java最简单的输入输出 java输出语句怎么写 去百度文库,查看完整内容> 内容来自用户:白岸海歌 System.out.print ——标准输出流 Java的流类,主要是:输入流类InputStream输出流类OutputStream Java系统预先定义好3个流对象,静态…

Java程序入口+输出语句+数据类型

一(Java程序入口):要想执行一个java程序,就必须有一个程序入口,且该入口为固定格式:public static void main(String[ ] args){}。注意:是main而不是mian,Str…

JAVA 循环控制语句以及输入输出

JAVA 循环控制语句以及输入输出 顺序结构分支结构if 语句switch 语句 循环结构while 循环for 循环do while 循环 输入输出输出到控制台从键盘输入 JAVA 里的程序控制语句主要分为顺序结构、分支结构(选择)和循环结构。 顺序结构 顺序结构比较简单&#x…

JAVA输出语句及变量

文章目录 语句输出在.java文件里一共能存在2样东西;注释的分类:变量标识符变量名的命名规范: 语句输出 格式一:println.带有换行效果 格式二:print.不带换行效果 (语句是程序执行的最小单元,是以";"结束的.) “ System.out.println();”输入快捷方法…

java的打印语句_java打印输出语句是什么?

打印输出语句有:换行打印“System.out.println();”,不换行打印“System.out.print();”,字节输出“System.out.write();”,按格式输出“System.out.printf();”。 Java中的输出语句有以下四种:System.out.println(111…

Java输入/输出

File类文本(Text)输入/输出 输出用PrintWriter类try-with-resources来自动关闭资源用Scanner来读取文本流式处理文本文件和二进制文件 二进制(Binary)文件输入/输出 二进制输入/输出到文件FilterInputStream/FilterOutputStream D…

Java输入输出

源代码见:点击打开链接 引言:在平时java开发中,被输入输出搞得头疼。特此写下这篇博客,一是为了总结输入输出,二是为了和大家分享。如果大家觉得写得好,就请高抬贵手点个赞呗!!&…

JAVA的输入输出

1.Java的输出 System,out,println(); //输出且换行 System.out.print(); //输出不换行 System.out.printf(); //提供字符格式化 示例 class Output{public static void main(String args[]){System.out.println("1.println");System.out.println("2.println&qu…

[JAVA]java中的打印输出语句

java中的打印语句分为三种: System.out.print(); System.out.println(); System.out.printf(); 1.System.out.print(); 打印在引号里的字符串 int x 5; System.out.print("今天是周" x); 打印结果: 2.System.out.println(); 和print…

java怎么完成输出语句

我们在前面的文章和案例中,其实早就知道Java是如何实现输出功能的了。没错,就是利用System.out.println()语句来实现的!接下来壹哥就给大家详细解读一下这个语句的作用及其含义。 1. System 我们先来看看System是个什么东东。 System是Jav…

Java的输出语句与注释

控制台输出语句 在Java中想要用控制台输出语句首先得先初步认识如下代码: 一,代码块System.out.print("输出内容");注意:Java严格区分大小写,大小写不能搞错。括号里要打引号。代码块结束之后加上; 二,方法…

Java中简单的输入输出语句

Java中简单的输入输出语句 一、输入语句 1.使用Scanner类 使用步骤: (1)导包 import java.util.Scanner; 这一步是必须要做的!!! (2)使用Scanner创建对象 Scanner scnew Scanner(System.in);//sc是你所创建的变量名&#…

Java016——Java输入输出语句

一、输出语句 Java常用的输出语句有三种: 1)System.out.println(); 换行输出,输出后会自动换行。 //示例 System.out.println("Hello"); System.out.println("World");//输出 Hello World2)System.out.pri…

【单元测试】Junit 4(七)--junit4 TestRunnner

Test Runners 我没想到一个特别合适的词来形容Test Runners的作用,所以多说几句: Test Runners 是具有特殊功能的执行测试用例的通道,也可以理解为测试的执行者,例如可以同时运行多个测试用例,也可以具有这个测试执行…

浅谈单元测试 Junit4

JUint是Java编程语言的单元测试框架,用于编写和运行可重复的自动化测试。本文主要针对Junit4要点进行梳理总结。 一、浅谈单元测试 1.1 什么是单元测试 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于…

JUnit4高级篇-由浅入深

JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。 先简单解释一下什么是Annotation,这个单词一般是翻译成元数据。元数据是什么?元数据就是描述数据的数据。也就是说,这个东西在…

Junit4Junit5对比

Junit是Java编程语言的单元测试框架&#xff0c;用来编写单元测试代码。随着Junit5的盛行&#xff0c;与Junit4有何差异。 JDK支持 Junit4需要Java5版本 Junit5需要Java8版本 Maven依赖 Junit4不区分模块&#xff0c;只有一个jar&#xff1a; <dependency><groupId>…

eclipse中Junit4(单元测试)的配置和使用

在项目的实际开发中&#xff0c;我们需要在完成每层的功能代码实现之后去对该功能的代码进行测试&#xff0c;这是因为如果在所有的代码都写完之后在测试的话&#xff0c;会造成调试困难&#xff0c;代码修改起来也很繁琐&#xff0c;这样开发效率会大大降低&#xff0c;不利于…

IDEA中添加junit4的三种方法

1、第一种方法 首先创建一个工程&#xff0c;创建好一个测试类&#xff0c;类的名称最好不要取Test&#xff0c;接下来写下一个注解Test&#xff0c;此时会报错。 报错的原因是创建的工程项目没有导入Junit4依赖&#xff0c;具体查看是在左上角 file–>project structure …

JUnit 4 与 TestNG 对比

Junit 4 和 TestNG 都是 Java 方面非常流行的单元测试框架。在功能上两个框架都非常类似。到底哪个比较好&#xff1f;在Java项目中我们应该选择哪个框架&#xff1f; 下图将会对Junit 4 和 TestNG 做个功能特征的对比。 注解支持 Junit 4 和 TestNG 在注解方面的实现非常相似。…