【从零开始学习深度学习】22. 卷积神经网络(CNN)中填充(padding)与步幅(stride)详解,填充、步幅、输入及输出之间的关系
目录
- 1 填充(padding)
- 2 步幅(stride)
- 总结
在上一篇文章中,我们使用高和宽为3的输入与高和宽为2的卷积核得到高和宽为2的输出。一般来说,假设输入形状是 n h × n w n_h\times n_w nh×nw,卷积核窗口形状是 k h × k w k_h\times k_w kh×kw,那么输出形状将会是
( n h − k h + 1 ) × ( n w − k w + 1 ) . (n_h-k_h+1) \times (n_w-k_w+1). (nh−kh+1)×(nw−kw+1).
所以卷积层的输出形状由输入形状和卷积核窗口形状决定
。本文我们将介绍卷积层的两个超参数,即填充和步幅。它们可以对给定形状的输入和卷积核改变输出形状。
1 填充(padding)
填充(padding)是指在输入高和宽的两侧填充元素(通常是0元素)。图1里我们在原输入高和宽的两侧分别添加了值为0的元素,使得输入高和宽从3变成了5,并导致输出高和宽由2增加到4。图1中的阴影部分为第一个输出元素及其计算所使用的输入和核数组元素: 0 × 0 + 0 × 1 + 0 × 2 + 0 × 3 = 0 0\times0+0\times1+0\times2+0\times3=0 0×0+0×1+0×2+0×3=0。
一般来说,如果在高的两侧一共填充 p h p_h ph行,在宽的两侧一共填充 p w p_w pw列,那么输出形状将会是
( n h − k h + p h + 1 ) × ( n w − k w + p w + 1 ) , (n_h-k_h+p_h+1)\times(n_w-k_w+p_w+1), (nh−kh+ph+1)×(nw−kw+pw+1),
也就是说,输出的高和宽会分别增加 p h p_h ph和 p w p_w pw。
在很多情况下,我们会设置 p h = k h − 1 p_h=k_h-1 ph=kh−1和 p w = k w − 1 p_w=k_w-1 pw=kw−1来使输入和输出具有相同的高和宽。这样会方便在构造网络时推测每个层的输出形状。假设这里 k h k_h kh是奇数,我们会在高的两侧分别填充 p h / 2 p_h/2 ph/2行。如果 k h k_h kh是偶数,一种可能是在输入的顶端一侧填充 p h / / 2 p_h//2 ph//2行,而在底端一侧填充 p h / / 2 + 1 p_h//2+1 ph//2+1行。在宽的两侧填充同理。
卷积神经网络经常使用奇数高宽的卷积核,如1、3、5和7,所以两端上的填充个数相等。对任意的二维数组X
,设它的第i
行第j
列的元素为X[i,j]
。当两端上的填充个数相等,并使输入和输出具有相同的高和宽时,我们就知道输出Y[i,j]
是由输入以X[i,j]
为中心的窗口同卷积核进行互相关计算得到的。
下面的例子里我们创建一个高和宽为3的二维卷积层(卷积核),然后设输入高和宽两侧的填充数分别为1。给定一个高和宽为8的输入,我们发现输出的高和宽也是8。
import torch
from torch import nn# 定义一个函数来计算卷积层。它对输入和输出做相应的升维和降维
def comp_conv2d(conv2d, X):# (1, 1)代表批量大小和通道数均为1X = X.view((1, 1) + X.shape)Y = conv2d(X)return Y.view(Y.shape[2:]) # 排除不关心的前两维:批量和通道# 注意这里是两侧分别填充1行或列,所以在两侧一共填充2行或列
conv2d = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3, padding=1)X = torch.rand(8, 8)
comp_conv2d(conv2d, X).shape
输出:
torch.Size([8, 8])
当卷积核的高和宽不同时,我们也可以通过设置高和宽上不同的填充数使输出和输入具有相同的高和宽。
# 使用高为5、宽为3的卷积核。在高和宽两侧的填充数分别为2和1
conv2d = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=(5, 3), padding=(2, 1))
comp_conv2d(conv2d, X).shape
输出:
torch.Size([8, 8])
2 步幅(stride)
在上一篇文章中介绍了二维互相关运算。卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。我们将每次滑动的行数和列数称为步幅(stride)
。
目前我们看到的例子里,在高和宽两个方向上步幅均为1。我们也可以使用更大步幅。图2展示了在高上步幅为3、在宽上步幅为2的二维互相关运算。可以看到,输出第一列第二个元素时,卷积窗口向下滑动了3行,而在输出第一行第二个元素时卷积窗口向右滑动了2列。当卷积窗口在输入上再向右滑动2列时,由于输入元素无法填满窗口,无结果输出。图2中的阴影部分为输出元素及其计算所使用的输入和核数组元素: 0 × 0 + 0 × 1 + 1 × 2 + 2 × 3 = 8 0\times0+0\times1+1\times2+2\times3=8 0×0+0×1+1×2+2×3=8、 0 × 0 + 6 × 1 + 0 × 2 + 0 × 3 = 6 0\times0+6\times1+0\times2+0\times3=6 0×0+6×1+0×2+0×3=6。
一般来说,当高上步幅为 s h s_h sh,宽上步幅为 s w s_w sw时,输出形状为
⌊ ( n h − k h + p h + s h ) / s h ⌋ × ⌊ ( n w − k w + p w + s w ) / s w ⌋ . \lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor. ⌊(nh−kh+ph+sh)/sh⌋×⌊(nw−kw+pw+sw)/sw⌋.
如果设置 p h = k h − 1 p_h=k_h-1 ph=kh−1和 p w = k w − 1 p_w=k_w-1 pw=kw−1,那么输出形状将简化为 ⌊ ( n h + s h − 1 ) / s h ⌋ × ⌊ ( n w + s w − 1 ) / s w ⌋ \lfloor(n_h+s_h-1)/s_h\rfloor \times \lfloor(n_w+s_w-1)/s_w\rfloor ⌊(nh+sh−1)/sh⌋×⌊(nw+sw−1)/sw⌋。更进一步,如果输入的高和宽能分别被高和宽上的步幅整除,那么输出形状将是 ( n h / s h ) × ( n w / s w ) (n_h/s_h) \times (n_w/s_w) (nh/sh)×(nw/sw)。
下面我们令高和宽上的步幅均为2,从而使输入的高和宽减半。
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
comp_conv2d(conv2d, X).shape
输出:
torch.Size([4, 4])
接下来是一个稍微复杂点儿的例子。
conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4))
comp_conv2d(conv2d, X).shape
输出:
torch.Size([2, 2])
为了表述简洁,当输入的高和宽两侧的填充数分别为 p h p_h ph和 p w p_w pw时,我们称填充为 ( p h , p w ) (p_h, p_w) (ph,pw)。特别地,当 p h = p w = p p_h = p_w = p ph=pw=p时,填充为 p p p。当在高和宽上的步幅分别为 s h s_h sh和 s w s_w sw时,我们称步幅为 ( s h , s w ) (s_h, s_w) (sh,sw)。特别地,当 s h = s w = s s_h = s_w = s sh=sw=s时,步幅为 s s s。在默认情况下,填充为0,步幅为1。
总结
- 填充可以增加输出的高和宽。这常用来使输出与输入具有相同的高和宽。
- 步幅可以减小输出的高和宽,例如输出的高和宽仅为输入的高和宽的 1 / n 1/n 1/n( n n n为大于1的整数)。
对文章存在的问题,或者其他关于Python相关的问题,都可以在评论区留言或者私信我哦
如果文章内容对你有帮助,感谢点赞+关注!
关注下方GZH:阿旭算法与机器学习,可获取更多干货内容~欢迎共同学习交流
【从零开始学习深度学习】22. 卷积神经网络(CNN)中填充(padding)与步幅(stride)详解,填充、步幅、输入及输出之间的关系相关推荐
- 【 卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10)】
卷积神经网络CNN 数学原理分析与源码详解 深度学习 Pytorch笔记 B站刘二大人(9/10) 本章主要进行卷积神经网络的相关数学原理和pytorch的对应模块进行推导分析 代码也是通过demo实 ...
- 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( 线性卷积起点定理推导过程 )
文章目录 一.线性卷积起点定理推导过程 推导 [数字信号处理]线性时不变系统 LTI " 输入 " 与 " 输出 " 之间的关系 ( 线性卷积起点定理 | 左边 ...
- 花书+吴恩达深度学习(十三)卷积神经网络 CNN 之运算过程(前向传播、反向传播)
目录 0. 前言 1. 单层卷积网络 2. 各参数维度 3. CNN 前向传播反向传播 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十)卷积神经网络 ...
- 花书+吴恩达深度学习(十一)卷积神经网络 CNN 之池化层
目录 0. 前言 1. 最大池化(max pooling) 2. 平移不变形 3. 其他池化函数 4. 卷积和池化作为一种无限强的先验 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常 ...
- 花书+吴恩达深度学习(十)卷积神经网络 CNN 之卷积层
目录 0. 前言 1. 2D 图像卷积 2. 3D 图像卷积 3. 过滤器(核函数) 4. 过滤器应用于边缘检测 5. padding 填充 6. stride 步长 7. 使用卷积的动机 8. 1乘 ...
- 零基础学习PHP编程——详解Apache、PHP和Mysql之间的关系
详解Apache.PHP和Mysql之间的关系 注意: 本文主要写给基础薄弱的同学, 如有不当之处,还请指正. 访问源站 原创不易,转载请注明 欢迎交流: 640765823 学习方法 弄清楚Apa ...
- 水很深的深度学习(四)——卷积神经网络CNN
参考资料: 1.水很深的深度学习-CNN 2.卷积神经网络超详细介绍_呆呆的猫的博客-CSDN博客_卷积神经网络 3.大话卷积神经网络CNN(干货满满)-CSDN博客 卷积神经网络的概念 计算机视觉和 ...
- 【数字信号处理】线性时不变系统 LTI “ 输入 “ 与 “ 输出 “ 之间的关系 ( LTI 系统单位脉冲响应 | 卷积 | 卷积推导过程 )
文章目录 一.LTI 系统单位脉冲响应 二.卷积 一.LTI 系统单位脉冲响应 线性时不变系统 , 简称 " LTI " , 英文全称 Linear time-invariant ...
- 【深度学习】深入理解卷积神经网络(CNN)
CNN Author:louwill From:深度学习笔记 本文将为大家介绍一种用途更为广泛.性能更加优越的神经网络结构--卷积神经网络(Convolutional Neural Network, ...
最新文章
- hibernate缓存机制详细介绍
- linux远程关闭不中断
- Pascal's Triangle Leetcode Java and C++
- 唐山师范学院计算机考试,[河北]唐山师范学院2017年3月计算机一级考试报名时间...
- 2010 Stanford Local ACM Programming Contest-H解题报告
- 多线程:生产者消费者问题
- MyBatis直接执行SQL查询及批量插入数据
- [Machine Learning Algorithm] 决策树与迭代决策树(GBDT)
- 悲剧,当用cywin 写Linux脚本
- WAP技术入门(上)
- linux 格式化磁盘失败,linux格式化磁盘出错
- 港澳台身份证校验规则和计算方法
- android+5.1+root,最新的安卓5.1.1 ROOT教程(不需要刷第三方内核)
- Neural Networks and Deep Learning
- 无法找到合适的显示设备.正在关闭程序
- 使用免费小图标(趣味)
- 电脑怎么用照片做视频?哪个软件简单好用?3步教你轻松制作!
- 《机器学习》周志华第10章降维与度量学习 思维导图+笔记+习题
- Unity 基础开发-WebGL发布无法运行问题
- 单片机c语言中io取反,单片机小白学步(21) IO口:基本的LED和按键操作
热门文章
- 2022年全球与中国电子制造服务(EMS)市场现状及未来发展趋势
- 善无大小 随份随力 - 最新各界赈灾援助名单
- java取余位运算_java学习--高效的除模取余运算(n-1)hash
- 图片导成PDF后页面大小不同怎么办
- 12.CUDA编程手册中文版---附录H数学方法
- html日期属性取值,HTML Input Date value用法及代码示例
- 王福强老师的《Spring揭秘》读后感-IOC容器之ApplicationContext相关
- K-means对图像进行分类
- Dart语法学习-数据类型
- 台式电脑开机跳出来计算机,各种台式电脑、笔记本无法开机出现英文提示,解决办法都在这里...