卷积层里的填充和步幅(padding和strides)

目录

一、填充和步幅相关概念

1、填充(padding)

2、步幅(strides)

3、总结 

二、代码实现

1、填充(padding)

2、步幅(strides)

3、小结


一、填充和步幅相关概念

1、填充(padding)

       当输入图片比较小的时候,我们一般会进行填充,填充是指在输入周围添加额外的行/列,填充的行数或列数一般等于卷积核的行数或列数减1,这样经过卷积后的图片不会变小,并且可以保留原始图像的边界信息,以便我们设计更深层次的神经网络。

2、步幅(strides)

       当输入图片比较大的时候,我们一般会使用较大的步幅,步幅是指行/列的滑动步长,可以通过调大步幅大幅降低图像的宽度和高度。例如如果我们发现原始的输入分辨率十分冗余。步幅则可以在这类情况下提供帮助。

3、总结 

二、代码实现

1、填充(padding)

       在应用多层卷积时,我们常常丢失边缘像素。由于我们通常使用小卷积核,因此对于任何单个卷积,我们可能只会丢失几个像素。但随着我们应用许多连续卷积层,累积丢失的像素数就多了。解决这个问题的简单方法即为填充(padding):在输入图像的边界填充元素(通常填充元素是 $0$)。

       例如,在下图中,我们将 $3 \times 3$ 输入填充到 $5 \times 5$,那么它的输出就增加为 $4 \times 4$。阴影部分是第一个输出元素以及用于输出计算的输入和核张量元素:$0\times0+0\times1+0\times2+0\times3=0$

       通常,如果我们添加 $p_h$ 行填充(大约一半在顶部,一半在底部)和 $p_w$ 列填充(左侧大约一半,右侧一半),则输出形状将为:

$(n_h-k_h+p_h+1)\times(n_w-k_w+p_w+1).$

       这意味着输出的高度和宽度将分别增加 $p_h$ 和 $p_w$。在许多情况下,我们需要设置 $p_h=k_h-1$ 和 $p_w=k_w-1$,使输入和输出具有相同的高度和宽度。这样可以在构建网络时更容易地预测每个图层的输出形状。一般 $k_h, h_w$ 取奇数,我们将在高度(宽度)的两侧填充 $p_h/2$ 行($p_w/2$ 列)。

       卷积神经网络中卷积核的高度和宽度通常为奇数,例如1、3、5或7。选择奇数的好处是,保持空间维度的同时,我们可以在顶部和底部填充相同数量的行,在左侧和右侧填充相同数量的列。

       比如,在下面的例子中,我们创建一个高度和宽度为3的二维卷积层,并在所有侧边填充1个像素。给定高度和宽度为8的输入,则输出的高度和宽度也是8。

import torch
from torch import nn# 为了方便起见,我们定义了一个计算卷积层的函数。
# 此函数初始化卷积层权重,并对输入和输出提高和缩减相应的维数
def comp_conv2d(conv2d, X):# 这里的(1,1)表示批量大小和通道数都是1X = X.reshape((1, 1) + X.shape) # 元组的相加规则:(1, 1)+(8, 8)=(1, 1, 8, 8)Y = conv2d(X)# 省略前两个维度:批量大小和通道return Y.reshape(Y.shape[2:])# 请注意,这里每边都填充了1行或1列,因此总共添加了2行或2列
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1)  # kernel_size=3、padding=1,以保持输出与输入具有相同的形状。
X = torch.rand(size=(8, 8))
comp_conv2d(conv2d, X).shape
torch.Size([8, 8])

       当卷积核的高度和宽度不同时,我们可以填充不同的高度和宽度,使输出和输入具有相同的高度和宽度。在如下示例中,我们使用高度为5,宽度为3的卷积核,高度和宽度两边的填充分别为2和1。

conv2d = nn.Conv2d(1, 1, kernel_size=(5, 3), padding=(2, 1))
comp_conv2d(conv2d, X).shape
torch.Size([8, 8])

2、步幅(strides)

       在计算互相关时,卷积窗口从输入张量的左上角开始,向下、向右滑动。在前面的例子中,我们默认每次滑动一个元素。但是,有时候为了高效计算或是缩减采样次数,卷积窗口可以跳过中间位置,每次滑动多个元素。

       我们将每次滑动元素的数量称为步幅(stride)。到目前为止,我们只使用过高度或宽度为 $1$ 的步幅,下面我们将使用较大的步幅。如下图是垂直步幅为3,水平步幅为2的二维互相关运算。着色部分是输出元素以及用于输出计算的输入和内核张量元素:

$ 0\times 0+0\times 1+1\times 2+2\times 3=8 $$ $$ 0\times 0+6\times 1+0\times 2+0\times 3=6 $

       可以看到,为了计算输出中第一列的第二个元素和第一行的第二个元素,卷积窗口分别向下滑动三行和向右滑动两列。但是,当卷积窗口继续向右滑动两列时,没有输出,因为输入元素无法填充窗口(除非我们添加另一列填充)。

       通常,当垂直步幅为 $ s_h$、水平步幅为 $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.$

       下面,我们将高度和宽度的步幅设置为2,从而将输入的高度和宽度减半。

conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)    # (8-3+2+2)/2=4.5
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_w$ 时,我们称之为填充 $(p_h, p_w)$。当 $p_h = p_w = p$ 时,填充是 $p$。同理,当高度和宽度上的步幅分别为 $s_h$ 和 $s_w$ 时,我们称之为步幅 $(s_h, s_w)$。特别地,当 $s_h = s_w = s$ 时,我们称步幅为 $s$。默认情况下,填充为0,步幅为1。在实践中,我们很少使用不一致的步幅或填充,也就是说,我们通常有 $p_h = p_w$ 和 $s_h = s_w$

3、小结

  • 填充可以增加输出的高度和宽度。这常用来使输出与输入具有相同的高和宽。
  • 步幅可以减小输出的高和宽,例如输出的高和宽仅为输入的高和宽的$1/n$$n$是一个大于1的整数)。
  • 填充和步幅可用于有效地调整数据的维度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/220495.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【TB作品】STM32 PWM之实现呼吸灯,STM32F103RCT6,晨启

文章目录 完整工程参考资料实验过程 实验任务: 1:实现PWM呼吸灯,定时器产生PWM,控制实验板上的LED灯亮灭; 2:通过任意两个按键切换PWM呼吸灯输出到两个不同的LED灯,实现亮灭效果; 3&…

Flink系列之:自定义函数

Flink系列之:自定义函数 一、自定义函数二、概述三、开发指南四、函数类五、求值方法六、类型推导七、自动类型推导八、定制类型推导九、确定性十、内置函数的确定性十一、运行时集成十二、标量函数十三、表值函数十四、聚合函数十五、表值聚合函数 一、自定义函数 …

【EI会议征稿通知】第三届区块链、信息技术与智慧金融国际学术会议 (ICBIS2024)

第三届区块链、信息技术与智慧金融国际学术会议 (ICBIS2024) The 3rd International Academic Conference on Blockchain, Information Technology and Smart Finance 第三届区块链、信息技术与智慧金融国际学术会议 (ICBIS2024) 将于2024年2月23-25日在马来西亚举行。本次会…

回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 (多指标,多图)

回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 (多指标,多图) 目录 回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 (多指标,多图&#…

根据电脑硬件条件,确定Pytorch的版本?

根据CUDA确定Pytorch的版本 1 显卡型号:NVIDIA GeForce GTX 970 2 显卡算力:5.2 https://en.wikipedia.org/wiki/CUDA3 确定CUDA Runtime 4 看自己的驱动: CUDA Driver Version —— 12.2 nvidia-smi 5 确定使用的版本 前面3中runtime …

Zookeeper-快速开始

Zookeeper介绍 简介:ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来解决分布式集群中应用系统的一致性问题。 设计目标:将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效…

Ubuntu 虚拟机环境,编译AOSP源码

环境 : VMware虚拟机 Ubuntu 20.04.3 LTS 搭建配置开发环境 sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl…

持续集成交付CICD:K8S 通过模板文件自动化完成前端项目应用发布

目录 一、实验 1.环境 2.GitLab 更新deployment文件 3.GitLab更新共享库前端项目CI与CD流水线 4.K8S查看前端项目版本 5.Jenkins 构建前端项目 6.Jenkins 再次构建前端项目 二、问题 1. Jenkins 构建CI 流水线报错 2. Jenkins 构建CI 流水线弹出脚本报错 3. Jenkins…

fiddler的下载、安装

在官网下载fiddler 点击Download For Windows 下载完成 安装fiddler 点击.exe文件,进行傻瓜式安装,即可安装成功 配置fiddler 点击OK后,重启fiddler, 即可抓包

JS基础之模块化

JS基础之模块化 JS模块化模块化前端发展 什么是模块?怎么定义模块化IIFE匿名函数自调用IIFE模式增强模块化的好处 JS模块化 模块化 JS DOM操作 代码规范管理的标准 不同模块间的管理模块内部自组织 标准bundler (模块构建工具) ESNext TS -> ES5 前端发展 生态 …

打开VScode时不打开上次使用的文件夹

是不是很烦VScode 打开新的文件夹,每次都打开上次使用过的文件夹,只需在设置里面改一个设置就可以避免了。 Ctrl ,打开设置,搜索 window.restoreWindows 通过这种设置就可以让VScode 每次打开新的文件夹而不打开上次的文件夹。

“No.”竟然不是Number的缩写!92%的人不知道为什么!柯桥成人英语学习就来泓畅教育

今天给大家介绍一个很有意思的表达 不知道,同学们有没有发现 ↓ 英语中,数字经常和“No.”一起出现 大家有深究过“No.”是什么意思吗 有的同学会说,是不是“Number”的缩写 虽然很像,但是它俩还真不一样 接下来我们就来盘一…

Leetcode—12.整数转罗马数字【中等】

2023每日刷题&#xff08;六十四&#xff09; Leetcode—12.整数转罗马数字 实现代码 const pair<int, string> valueTable[] {{1000, "M"},{900, "CM"},{500, "D"},{400, "CD"},{100, "C"},{90, "XC"},…

web应用开发技术的一些概念

一、Servlet 1.Servlet的工作过程&#xff1a; Servelt的工作流程示意图 &#xff08;1&#xff09;客户端发起一个Http请求到服务器&#xff0c;请求特定的资源或者是要执行特定的操作 &#xff08;2&#xff09;服务器在接收到请求后&#xff0c;根据请求相应的URL将请求分发…

N叉树后序遍历

给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 后序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [1,null,3,2,4,null,5,6] 输出&am…

SAP 特殊采购类80简介

前面我们已经测试特殊采购类40、70,我们今天测试一下特殊采购类80。 特殊采购类80:在替代工厂生产,在成品层维护特殊采购类,需求和收货在计划工厂完成,成品生产和组件采购在生产工厂完成。 80采购类也是我们在SAP系统中实现跨工厂需求传递的一种方式。它具有传递方式简单、…

这个食堂管理大招,再不知道就晚了!

随着社会的不断发展&#xff0c;餐饮行业也在不断创新和进步。在这个数字化时代&#xff0c;智能技术为各行各业提供了更高效、便捷的解决方案。 食堂作为人们日常生活中不可或缺的一部分&#xff0c;也迎来了智能化的时代。智慧收银系统不仅提高了食堂的运营效率&#xff0c;还…

开关电源测试 | 如何测试开关电源峰值负载功率?

开关电源峰值负载功率测试方法 测试设备&#xff1a; 1.电子负载&#xff1a;根据负载的额定电压和电流来选择。 2.功率计&#xff1a;需要考虑电源的额定电压和电流、测试频率等。 3.示波器&#xff1a;需要考虑测试频率和带宽等。 测试步骤&#xff1a; 1.将电源调整到正常工…

明理信息科技打造专属个人或企业知识付费平台,核心功能设计

在当今信息爆炸的时代&#xff0c;知识管理已经成为了每个人必须面对的问题。然而&#xff0c;市面上的知识付费平台大多数都是通用的&#xff0c;无法满足个性化需求。 因此&#xff0c;明理信息科技提供了一款专属定制的适合个人的知识付费平台。核心产品能力如下&#xff1…

vs code(Visual Studio Code)使用Remote SSH插件连接不上,反复输入密码

使用Remote SSH插件连接不上&#xff0c;反复输入密码问题解决分为两步 1&#xff0c;点击此处 可以得到配置文件的存放目录&#xff0c;进入硬盘这个目录 打开这个文件&#xff0c;知道你服务器的所在行ip&#xff0c;整行删掉&#xff0c;尝试再次连接 2&#xff0c;如果1不…