动手学深度学习20 卷积层里的填充和步幅

2024-05-16 09:12

本文主要是介绍动手学深度学习20 卷积层里的填充和步幅,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

动手学深度学习20 卷积层里的填充和步幅

  • 1. 填充和步幅
  • 2. 代码实现
  • 3. QA
  • 4. 练习

课本: https://zh-v2.d2l.ai/chapter_convolutional-neural-networks/padding-and-strides.html

1. 填充和步幅

在这里插入图片描述

卷积网络可调的超参数。
当输入shape一定,卷积核shape一定,想要做更深层的网络怎么处理数据shape不够大的问题,填充。输出可能比输入还要大。
在这里插入图片描述
在这里插入图片描述
层数越多,计算越复杂,卷积核大小不变,输入输出shape大小是线性相关,加上步幅,成指数相关。shape大小下降比较快。
在这里插入图片描述

在这里插入图片描述
步幅通常取2。一般取填充合适,高和宽都是2的倍数,且步幅取2,每层网络都是把输入输出的高和宽全部做除2的操作。
填充:当不想模型模型改变输入的大小,或者想要训练深层网络时使用。
步幅:控制滑动窗口挪动行列的步长,成倍减少输入的形状。当输入shape过大,可以用步幅成倍缩小输出shape,减少计算量。
在这里插入图片描述

2. 代码实现

超参数:padding stride
当输入数据不是方块,可以通过超参数控制调整输出数据的shape。

# 当不考虑输入输出通道 批量大小数 输入就是一个矩阵
# padding=1 上下左右各填充一行 每一边填充的多少行
import torch
from torch import nn# 为了方便起见,我们定义了一个计算卷积层的函数。
# 此函数初始化卷积层权重,并对输入和输出提高和缩减相应的维数
def comp_conv2d(conv2d, X):# 这里的(1,1)表示批量大小和通道数都是1# 元组连接运算符 (1, 1)+(1,1)=(1,1,1,1)X = X.reshape((1, 1)+ X.shape)Y = conv2d(X)# 省略前两个维度:批量大小和通道return Y.reshape(Y.shape[2:])# 请注意,这里每边都填充了1行或1列,因此总共添加了2行或2列
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1)
X = torch.rand(size=(8, 8))
print(comp_conv2d(conv2d, X).shape)# 当卷积核的高度和宽度不同时,我们可以填充不同的高度和宽度,使输出和输入具有相同的高度和宽度
conv2d = nn.Conv2d(1, 1, kernel_size=(5, 3), padding=(2,1))
print(comp_conv2d(conv2d, X).shape)# 高度和宽度的步幅设置为2,从而将输入的高度和宽度减半
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
print(comp_conv2d(conv2d, X).shape)conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4))
print(comp_conv2d(conv2d, X).shape)
# 认情况下,填充为0,步幅为1。在实践中,我们很少使用不一致的步幅或填充.
torch.Size([8, 8])
torch.Size([8, 8])
torch.Size([4, 4])
torch.Size([2, 2])

3. QA

  1. 是55层。每层减去4,(224-4)/4=55

  2. 一般填充会让输入输出高宽一样,通常设置为kernel-1, 为了让每层输入输出大小一样,这样输入输出关系计算方便。
    步幅一般取1,当觉得计算量太大,不想选用很多层,步幅就不取1,通常步幅取2,每次减半,计算能有多少次减半,把步幅均匀的插在卷积网络中。
    核大小通常是关键的。填充一般取默认的。步幅取决于你要把模型复杂度控制在什么程度。

  3. 卷积核边长一般选奇数,是为了对称,上下填充是对称的情况。一般卷积核用3*3,效果都差不多。

  4. 当224*224维度,五六次减半数据维度都没有了,没有办法做很深的网络,减半是很少的情况,多数情况输入输出shape是不变的。

  5. 步幅 填充 kernel 通道数 是神经网络架构的一部分,是网络怎么设计的一部分,不那么敏感,很少调整。当你用定义好的网络架构的时候,这些参数就已经被设定好了。
    在这里插入图片描述

  6. 实际上,多用经典网络结构。RestNet。当输入数据是个非常不一样的,经典的结构无法处理,可以自己设计。网络结构没有那么关键,只是一部分。数据是怎么预处理的,细节是怎么处理的也占很大部分。

  7. 分别应用可以用元组padding=(1,1) 行列表示。

  8. padding=1=(1,1), 左右各填充一行,跟slide一共填充多少行多少列不一样。

  9. 张量的形状一般都是整数,都有向上或向下取整。不会有小数的情况。

  10. 3*3视野小,但深网络视野就大了。
    在这里插入图片描述
    在这里插入图片描述

  11. nas-让超参数也参与训练,自动机器学习的一部分。或者根据硬件情况搜索一个比较好的参数。

  12. 信息一定会是丢失的。机器学习本质上是一个极端压缩算法。把原始计算机能理解的像素信息,文字的字符串信息等压缩到人能理解的语义空间。

  13. 有自动调参功能,不建议用,比较贵。

  14. autoguluon也有做nas, 比较贵。

  15. 验证集设置的很好,过拟合会很好的避免,自动调参会带来一定的过拟合,但可以控制。
    在这里插入图片描述

  16. 三层的33是否可以用2层55替代呢。效果上是可以替代的,但是3*3计算速度是更快的。计算复杂度,kernel计算是平方项,复杂度高,高宽的限制是线性的关系。

  17. 主流底层可以用大一点的kernel, 后面的用33多, 33便宜一点,构造方便一点。简单的网络容易通用。可以试。

  18. 一个特定的卷积层可以看特定的纹理,不同卷积层看不同的纹理。

  19. 更多的数据–数据贵;gpu计算替代了人力、数据的成本。用机器代替人力。
    在这里插入图片描述

4. 练习

  1. 对于本节中的最后一个示例,计算其输出形状,以查看它是否与实验结果一致。

  2. 在本节中的实验中,试一试其他填充和步幅组合。

  3. 对于音频信号,步幅=2说明什么?
    在这里插入图片描述

  4. 步幅大于1的计算优势是什么?
    可以快速的降低输出的维数

这篇关于动手学深度学习20 卷积层里的填充和步幅的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/994481

相关文章

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

Python与DeepSeek的深度融合实战

《Python与DeepSeek的深度融合实战》Python作为最受欢迎的编程语言之一,以其简洁易读的语法、丰富的库和广泛的应用场景,成为了无数开发者的首选,而DeepSeek,作为人工智能领域的新星... 目录一、python与DeepSeek的结合优势二、模型训练1. 数据准备2. 模型架构与参数设置3

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Go Mongox轻松实现MongoDB的时间字段自动填充

《GoMongox轻松实现MongoDB的时间字段自动填充》这篇文章主要为大家详细介绍了Go语言如何使用mongox库,在插入和更新数据时自动填充时间字段,从而提升开发效率并减少重复代码,需要的可以... 目录前言时间字段填充规则Mongox 的安装使用 Mongox 进行插入操作使用 Mongox 进行更

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

基于Java实现模板填充Word

《基于Java实现模板填充Word》这篇文章主要为大家详细介绍了如何用Java实现按产品经理提供的Word模板填充数据,并以word或pdf形式导出,有需要的小伙伴可以参考一下... Java实现按模板填充wor编程d本文讲解的需求是:我们需要把数据库中的某些数据按照 产品经理提供的 word模板,把数据

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一