【深度学习笔记】5_2 填充和步骤

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图

5.2 填充和步幅

在上一节的例子里,我们使用高和宽为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). (nhkh+1)×(nwkw+1).

所以卷积层的输出形状由输入形状和卷积核窗口形状决定。本节我们将介绍卷积层的两个超参数,即填充和步幅。它们可以对给定形状的输入和卷积核改变输出形状。

5.2.1 填充

填充(padding)是指在输入高和宽的两侧填充元素(通常是0元素)。图5.2里我们在原输入高和宽的两侧分别添加了值为0的元素,使得输入高和宽从3变成了5,并导致输出高和宽由2增加到4。图5.2中的阴影部分为第一个输出元素及其计算所使用的输入和核数组元素: 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

在这里插入图片描述

图5.2 在输入的高和宽两侧分别填充了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), (nhkh+ph+1)×(nwkw+pw+1),

也就是说,输出的高和宽会分别增加 p h p_h ph p w p_w pw

在很多情况下,我们会设置 p h = k h − 1 p_h=k_h-1 ph=kh1 p w = k w − 1 p_w=k_w-1 pw=kw1来使输入和输出具有相同的高和宽。这样会方便在构造网络时推测每个层的输出形状。假设这里 k h k_h kh是奇数,我们会在高的两侧分别填充 p h / 2 p_h/2 ph/2行。如果 k h k_h kh是偶数,一种可能是在输入的顶端一侧填充 ⌈ p h / 2 ⌉ \lceil p_h/2\rceil ph/2行,而在底端一侧填充 ⌊ p h / 2 ⌋ \lfloor p_h/2\rfloor ph/2行。在宽的两侧填充同理。

卷积神经网络经常使用奇数高宽的卷积核,如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)代表批量大小和通道数(“多输入通道和多输出通道”一节将介绍)均为1
    X = 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])

5.2.2 步幅

在上一节里我们介绍了二维互相关运算。卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。我们将每次滑动的行数和列数称为步幅(stride)。

目前我们看到的例子里,在高和宽两个方向上步幅均为1。我们也可以使用更大步幅。图5.3展示了在高上步幅为3、在宽上步幅为2的二维互相关运算。可以看到,输出第一列第二个元素时,卷积窗口向下滑动了3行,而在输出第一行第二个元素时卷积窗口向右滑动了2列。当卷积窗口在输入上再向右滑动2列时,由于输入元素无法填满窗口,无结果输出。图5.3中的阴影部分为输出元素及其计算所使用的输入和核数组元素: 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

在这里插入图片描述

图5.3 高和宽上步幅分别为3和2的二维互相关运算

一般来说,当高上步幅为 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. ⌊(nhkh+ph+sh)/sh×⌊(nwkw+pw+sw)/sw.

如果设置 p h = k h − 1 p_h=k_h-1 ph=kh1 p w = k w − 1 p_w=k_w-1 pw=kw1,那么输出形状将简化为 ⌊ ( 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+sh1)/sh×⌊(nw+sw1)/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的整数)。

注:除代码外本节与原书此节基本相同,原书传送门

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python中的os库

一.OS库简介 OS是Operating System的简写,即操作系统。 OS库是一个操作系统接口模块,提供一些方便使用操作系统相关功能的函数。 二.OS库常用函数 2.1文件和目录 2.1.1:os.getcwd() 作用:返回当前工作目录,结果是…

Vue3学习——路由prop配置、replace

写法一 在路由中可直接写prop: true&#xff0c;即可在页面中defineProps使用 相当于&#xff08;<Detail id“1” name“2” />&#xff09;,但只能是params {path: /service,name: 服务,component: () > import(../views/Service/index)&#xff0c;props: true}…

蓝桥杯前端Web赛道-寻找小狼人

蓝桥杯前端Web赛道-寻找小狼人 题目链接&#xff1a;0寻找小狼人 - 蓝桥云课 (lanqiao.cn) 题目要求&#xff1a; 其实通过题目要求以及题目中提供的gif可知&#xff0c;该题就是需要我们手动写出能够代替filter函数的函数 我们先分析题目给出的代码&#xff1a; let newcar…

Linux:Ansible的常用模块

模块帮助 ansible-doc -l 列出ansible的模块 ansible-doc 模块名称 # 查看指定模块的教程 ansible-doc command 查看command模块的教程 退出教程时候建议不要使用ctrlc 停止&#xff0c;某些shell工具会出现错误 command ansible默认的模块,执行命令&#xff0c;注意&#x…

单片机复位按键电路、唤醒按键电路

目录 单片机复位按键 外部手动复位 单片机复位按键电路 复位按键电路1 复位按键电路2 单片机唤醒按键 单片机唤醒按键电路 单片机复位按键 单片机复位&#xff1a;简单来说&#xff0c;复位引脚就是有复位信号&#xff0c;就是从头开始执行程序 本质&#xff1a;就是靠…

开源大模型LLM大爆发,数据竞赛已开启!如何使用FuseLLM实现大语言模型的知识融合?

开源大模型LLM大爆发&#xff0c;数据竞赛已开启&#xff01;如何使用FuseLLM实现大语言模型的知识融合&#xff1f; 现在大多数人都知道LLM是什么&#xff0c;以及可以做什么。 人们讨论着它的优缺点&#xff0c;畅想着它的未来&#xff0c; 向往着真正的AGI&#xff0c;又有…

NOIP 2008 普及组初赛试题及解析

NOIP 2008 普及组初赛试题及解析 一. 单项选择题 &#xff08;共20题&#xff0c;每题1.5分&#xff0c;共计30分。每题有且仅有一个正确答案.&#xff09;。二. 问题求解&#xff08;共2题&#xff0c;每题5分&#xff0c;共计10分&#xff09;三. 阅读程序写结果&#xff08;…

【JavaScript】手写 Promise(Promise\A+测试)

手写Promise-Promise\A测试 接下来咱们来测试一下手写Promise的代码能否通过Promise\A测试 Promise\A规范: Promise\A是社区推出的规范,其实最早Promise也是社区推出并实现的,旨在规范Promise的实现,里面约定了: 状态必须是:pending,fulfilled,rejectedthen方法的详细实现细…

ElasticSearch之suggester API

写在前面 当我们在使用搜索引擎进行的查询到时候&#xff0c;如果是输入错误的话&#xff0c;搜索引擎会给出一些搜索建议&#xff0c;如下&#xff1a; 在es中也提供了类似的功能&#xff0c;叫做suggester API。 1&#xff1a;原理和种类 原理是将查询的信息分为很多个词…

微服务Springcloud智慧工地APP源码 AI人工智能识别 支持多工地使用

目录 一、现状描述 二、行业难点 APP端功能 一、项目人员 二、视频监控 三、危大工程 四、绿色施工 五、安全隐患 AI智能识别 环境监测 实名制管理 智慧监测 智慧工地全套解决方案 一、现状描述 建筑工程建设具有明显的生产规模大宗性与生产场所固定性的特点。建…

Springboot+vue图书管理系统(小白)

图书管理系统 简介&#xff1a;一个最简约的图书管理系统&#xff0c;适用于小白用来练手 前端&#xff1a;VueElementUIechars 后端&#xff1a;SpringbootMybatisMySQL 功能模块&#xff1a; 信息管理&#xff1a;公告信息 操作日志 用户管理&#xff1a;用户信息 图书…

【NTN 卫星通信】基于NTN和TN的Inter-PLMN海事应用场景

1 场景概述 NTN和TN联合组网的场景&#xff0c;可以有多种应用方式&#xff0c;以下用例描述了同时使用多个卫星PLMN和一个地面5G PLMN的海事场景。 MNO-G是一家成熟的卫星PLMN运营商&#xff0c;运营着几颗GEO卫星。MNO-L是一个相对较新的卫星PLMN运营商&#xff0c;操作LEO卫…

Android布局优化之include、merge、ViewStub的使用,零基础入门android

面试了一位工作12年的程序员&#xff0c; 这位老哥有3年java开发经验&#xff0c;2年H5&#xff0c;7年Android开发经验&#xff0c;简历上写着精通Java&#xff0c;Android&#xff0c;熟悉H5开发。没有具体的技术点。 说实话我很期待这位老哥的面试&#xff0c;于是让人事邀…

STM32 Cubemx配置SPI编程(使用Flash模块)

文章目录 前言一、W25Q64模块介绍二、STM32Cubemx配置SPI三、SPI HAL库操作函数分析3.1查询方式3.2中断方式 四、Flash时序分析1.读器件ID指令2.写使能3.擦除扇区4.页编程5.读数据6.读状态寄存器 五、Flash驱动程序编写1.代码编写测试 总结 前言 本篇文章来为大家讲解一下Flas…

华为云项目部署

前端部署 将dist文件夹下的内容拷贝到/usr/local/nginx/html下 #启动脚本是在 # /usr/local/nginx/sbin/nginx #启动 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #停止 /usr/local/nginx/sbin/nginx -s stop #重载 /usr/local/nginx/sbin/nginx -s rel…

【基于React实现共享单车管理系统】—项目简介(一)

【基于React实现共享单车管理系统】—项目简介&#xff08;一&#xff09; 一、项目整体架构

springboot227旅游管理系统

springboot旅游管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在…

结合CMD文件,将变量写到ROM和Falsh中

结合CMD文件,将变量写到ROM和Falsh中 RAM是一种易失性存储器,它用于临时存储计算机程序和数据。当计算机关闭或断电时,RAM中的数据将丢失。RAM具有很快的读写速度,但容量有限。 Flash是一种非易失性存储器,它可以长期存储数据而不会丢失。Flash存储器通常用于存储操作系统…

K8S部署postgresql

&#xff08;作者&#xff1a;陈玓玏&#xff09; 一、前置条件 已部署k8s&#xff0c;服务端版本为1.21.14 二、部署postgresql 拉取镜像&#xff0c;docker pull postgres&#xff0c;不指定版本&#xff0c;自动从docker hub拉取最新版本&#xff1b;配置configmap&…

Redis的高性能之道

前言&#xff1a;做码农这么多年&#xff0c;我也读过很多开源软件或者框架的源码&#xff0c;在我看来&#xff0c;Redis是我看过写得最优美、最像一件艺术品的软件&#xff0c;正如Redis之父自己说的那样&#xff0c;他宁愿以一个糟糕的艺术家身份而不是一名好程序员被别人记…