pytorch学习——卷积神经网络——以LeNet为例

目录

一.什么是卷积?

二.卷积神经网络的组成

三.卷积网络基本元素介绍

3.1卷积

3.2填充和步幅

3.2.1填充(Padding)

        填充是指在输入数据周围添加额外的边界值(通常是零),以扩展输入的尺寸。填充可以在卷积操作中起到两个主要的作用:

3.2.2步幅(Stride)

 3.3多输入通道

3.4池化层 

 四.LeNet


一.什么是卷积?

        当我们谈论"卷积"时,通常指的是数学中的卷积运算。在卷积神经网络中,卷积操作是一种数学运算,用于处理图像和其他具有网格结构的数据。

        可以将卷积操作想象为两个函数之间的一种运算。首先,我们有一个输入函数(比如图像),它表示为一个矩阵或张量。然后,我们有另一个函数(称为卷积核或滤波器),它也是一个矩阵或张量。

        卷积操作的核心思想是将卷积核与输入函数的局部区域进行逐元素的乘法,并将乘积结果相加,从而得到输出函数的对应位置的值。这个过程可以通过滑动卷积核的方式在输入函数上进行。具体来说,卷积核从输入函数的左上角开始,按照一定的步长(stride)在输入函数上滑动,每次都与输入函数的一个局部区域进行逐元素的乘法并求和,得到输出函数的一个元素。

 实现示例中的卷积运算:

import torch
from torch import nn
from d2l import torch as d2ldef corr2d(X, K):  #@save"""计算二维互相关运算"""h, w = K.shapeY = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i, j] = (X[i:i + h, j:j + w] * K).sum()return Y
X = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]])
K = torch.tensor([[0.0, 1.0], [2.0, 3.0]])
corr2d(X, K)#结果
tensor([[19., 25.],[37., 43.]])

        通过卷积操作,我们可以提取输入函数中的特征。卷积核中的权重决定了它对输入函数的不同局部模式的响应程度。例如,在图像处理中,卷积核可以检测边缘、纹理和其他图像特征。通过在网络中学习这些卷积核的权重,网络可以自动发现和提取图像中的有用特征。

推荐博客:CNN笔记:通俗理解卷积神经网络_cnn卷积神经网络_v_JULY_v的博客-CSDN博客

二.卷积神经网络的组成

        一个完整的卷积神经网络(Convolutional Neural Network,CNN)通常由以下几个主要组件组成:

  1. 输入层(Input Layer):接收原始输入数据(例如图像)的层。输入层的尺寸和通道数与输入数据的特征维度相对应。

  2. 卷积层(Convolutional Layer):卷积层是CNN的核心组件。它由一系列卷积核(滤波器)组成,每个卷积核负责检测输入特征中的某种局部模式。卷积层通过卷积操作提取输入数据的特征,并生成一系列特征图。

  3. 激活函数层(Activation Layer):在卷积层后面通常会应用激活函数,如ReLU(修正线性单元),以引入非线性特性。激活函数层对每个特征图上的每个元素进行逐元素的非线性变换。

  4. 池化层(Pooling Layer):池化层用于减小特征图的空间尺寸,并保留重要的特征。常见的池化操作包括最大池化和平均池化,通过降低空间分辨率来减少参数数量和计算量。

  5. 全连接层(Fully Connected Layer):全连接层将前面的卷积层和池化层的输出转换为分类或回归所需的向量形式。每个神经元与上一层的所有神经元相连接,通过学习权重和偏置来进行特征组合和分类。

  6. 输出层(Output Layer):输出层根据具体任务的需求确定,可以是用于分类的softmax层,用于回归的线性层,或者其他适当的激活函数层。

除了上述主要组件之外,卷积神经网络还可能包含其他一些辅助层或技术:

  • 批归一化层(Batch Normalization Layer):用于在网络的训练过程中对每个小批量样本进行归一化,加速收敛并提高鲁棒性。
  • Dropout层:通过随机将一部分神经元的输出置零来减少过拟合。
  • 损失函数(Loss Function):用于衡量网络输出与真实标签之间的差异,根据具体任务选择适当的损失函数。
  • 优化器(Optimizer):用于更新网络中的权重和偏置,以最小化损失函数。常见的优化算法包括随机梯度下降(SGD)、Adam、RMSProp等。

        这些组件和技术的组合形成了一个完整的卷积神经网络,能够对输入数据进行特征提取、分类、回归等任务,并在训练过程中通过反向传播算法进行参数优化。网络的具体架构和层数可以根据任务的复杂性和数据集的特点进行设计和调整。

三.卷积网络基本元素介绍

3.1卷积

见上

3.2填充和步幅

3.2.1填充(Padding)

        填充是指在输入数据周围添加额外的边界值(通常是零),以扩展输入的尺寸。填充可以在卷积操作中起到两个主要的作用:

  • 保持特征图尺寸:卷积操作会导致特征图尺寸减小,通过填充可以控制特征图的大小,使其与输入大小相匹配。这对于在网络层之间传递信息和保持空间分辨率很重要。
  • 边缘信息保留:填充可以防止边缘信息的丢失。在没有填充的情况下,边缘像素只能通过较少的卷积操作进行处理,导致边缘信息在特征图中逐渐减少。通过填充,可以保留更多的边缘信息。

3.2.2步幅(Stride)

        步幅是指卷积核在输入数据上滑动的步长。通常,步幅的值是正整数。较大的步幅会导致特征图尺寸减小,因为卷积核在输入上移动的距离增加了。步幅的作用主要体现在两个方面:

  • 特征图尺寸控制:通过调整步幅的大小,可以控制特征图的尺寸。较大的步幅可以减小特征图的尺寸,而较小的步幅可以保持更多的空间信息。
  • 特征提取的多尺度:较大的步幅可以在输入数据的不同位置上进行特征提取,从而捕捉到不同尺度的特征。这对于处理具有不同大小目标的图像很有用。

 3.3多输入通道

        当输入包含多个通道时,需要构造一个与输入数据具有相同输入通道数的卷积核,以便与输入数据进行互相关运算。

        下图中演示了一个具有两个输入通道的二维互相关运算的示例。阴影部分是第一个输出元素以及用于计算这个输出的输入和核张量元素:(1×1+2×2+4×3+5×4)+(0×0+1×1+3×2+4×3)=56。

 参考:6.4. 多输入多输出通道 — 动手学深度学习 2.0.0 documentation

3.4池化层 

        与卷积层类似,池化层运算符由一个固定形状的窗口组成,该窗口根据其步幅大小在输入的所有区域上滑动,为固定形状窗口(有时称为汇聚窗口)遍历的每个位置计算一个输出。 然而,不同于卷积层中的输入与卷积核之间的互相关计算,池化层不包含参数。 相反,池运算是确定性的,我们通常计算汇聚窗口中所有元素的最大值或平均值。这些操作分别称为最大池化层(maximum pooling)和平均池化层(average pooling)。

 

 

 四.LeNet

        LeNet——最早的卷积神经网络,总体来看,LeNet(LeNet-5)由两个部分组成:

  • 卷积编码器:由两个卷积层组成;

  • 全连接层密集块:由三个全连接层组成。

 LeNet架构图:

        每个卷积块中的基本单元是一个卷积层、一个sigmoid激活函数和平均汇聚层。请注意,虽然ReLU和最大汇聚层更有效,但它们在20世纪90年代还没有出现。每个卷积层使用5×5卷积核和一个sigmoid激活函数。这些层将输入映射到多个二维特征输出,通常同时增加通道的数量。第一卷积层有6个输出通道,而第二个卷积层有16个输出通道。每个2×2池操作(步幅2)通过空间下采样将维数减少4倍。卷积的输出形状由批量大小、通道数、高度、宽度决定。

        为了将卷积块的输出传递给稠密块,我们必须在小批量中展平每个样本。换言之,我们将这个四维输入转换成全连接层所期望的二维输入。这里的二维表示的第一个维度索引小批量中的样本,第二个维度给出每个样本的平面向量表示。LeNet的稠密块有三个全连接层,分别有120、84和10个输出。因为我们在执行分类任务,所以输出层的10维对应于最后输出结果的数量。

import torch
from torch import nn
from d2l import torch as d2l# 定义卷积神经网络
net = nn.Sequential(nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),  # 第一层卷积层nn.AvgPool2d(kernel_size=2, stride=2),  # 第一层池化层nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),  # 第二层卷积层nn.AvgPool2d(kernel_size=2, stride=2),  # 第二层池化层nn.Flatten(),  # 展平操作,将多维输入转换为一维向量nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),  # 全连接层1nn.Linear(120, 84), nn.Sigmoid(),  # 全连接层2nn.Linear(84, 10)  # 输出层,输出类别的数量为10
)

 以下是一段检查神经网络每个层形状的代码,可用于快速纠错

X = torch.rand(size=(1, 1, 28, 28), dtype=torch.float32)
for layer in net:X = layer(X)print(layer.__class__.__name__,'output shape: \t',X.shape)
#结果
Conv2d output shape:         torch.Size([1, 6, 28, 28])
Sigmoid output shape:        torch.Size([1, 6, 28, 28])
AvgPool2d output shape:      torch.Size([1, 6, 14, 14])
Conv2d output shape:         torch.Size([1, 16, 10, 10])
Sigmoid output shape:        torch.Size([1, 16, 10, 10])
AvgPool2d output shape:      torch.Size([1, 16, 5, 5])
Flatten output shape:        torch.Size([1, 400])
Linear output shape:         torch.Size([1, 120])
Sigmoid output shape:        torch.Size([1, 120])
Linear output shape:         torch.Size([1, 84])
Sigmoid output shape:        torch.Size([1, 84])
Linear output shape:         torch.Size([1, 10])

具体代码实现:6.6. 卷积神经网络(LeNet) — 动手学深度学习 2.0.0 documentation

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

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

相关文章

Git工具安装

Git 工具安装 1. 下载Git安装包2. 安装Git工具3. 简单的使用配置用户名 1. 下载Git安装包 打开官网 https://git-scm.com/downloads点击下载 2. 安装Git工具 右击以管理员身份运行 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9a99a73d54824800bc87db64f71f7602.png…

避免安装这5种软件,手机广告频繁弹窗且性能下降

在我们使用手机的日常生活中,选择合适的应用软件对于保持良好的使用体验至关重要。然而,有些软件可能会给我们带来不必要的麻烦和困扰。特别是那些频繁弹窗广告、导致手机性能下降的应用程序,我们应该尽量避免安装它们。 首先第一种&#xf…

Python-面向对象:面向对象、成员方法 、类和对象、构造方法、魔术方法、封装、继承、类型注解、多态(抽象类(接口))

版本说明 当前版本号[20230806]。 版本修改说明20230806初版 目录 文章目录 版本说明目录知识总览图面向对象初识对象生活中数据的组织程序中数据的组织使用对象组织数据 成员方法类的定义和使用成员变量和成员方法成员方法的定义语法注意事项 类和对象现实世界的事物和类使…

快速开发平台 WebBuilder 9 发布

WebBuilder 是一款强大,全面和高效的应用开发和运行平台。基于浏览器的集成开发环境,智能化的设计,能轻松完成常规桌面应用和面向手机等的移动应用开发。高效、稳定和可扩展的特点,适合复杂企业级应用的运行。跨平台、数据库和浏览…

【Spring Cloud 四】Ribbon负载均衡

Ribbon负载均衡 系列文章目录背景一、什么是Ribbon二、为什么要有Ribbon三、使用Ribbon进行负载均衡服务提供者A代码pom文件yml配置文件启动类controller 服务提供者Bpom文件yml配置文件启动类controller 服务消费者pom文件yml文件启动类controller 运行测试 四、Ribbon的负载均…

0140 数据链路层2

目录 3.数据链路层 3.6局域网 3.7广域网 3.8数据链路层设备 部分习题 3.数据链路层 3.6局域网 3.7广域网 3.8数据链路层设备 部分习题 1.如果使用5类UTP来设计一个覆盖范围为200m的10BASE-T以太网,需要采用的设备是() A.放大器 …

Selenium入门详细教程+实例演示

目录 1.Selenium概述 1.1什么是Selenium 1.2Selenium的优势 1.3Selenium WebDriver原理 2.Selenium环境搭建 3.Selenium 简单示例 4.八大元素定位 4.1定位方式 4.2定位方式的用法 5.Selenium API 5.1WebDriver 常用 API 5.2WebElement 常用 API 5.3代码示例 6.元素等待机…

阿里云瑶池 PolarDB 开源官网焕新升级上线

导读近日,阿里云开源云原生数据库 PolarDB 官方网站全新升级上线。作为 PolarDB 开源项目与开发者、生态伙伴、用户沟通的平台,将以开放、共享、促进交流为宗旨,打造开放多元的环境,以实现共享共赢的目标。 立即体验全新官网&…

【华秋推荐】物联网入门学习模块 ESP8266

随着全球信息技术的不断进步和普及,物联网成为当今备受关注的技术热点之一。通过物理和数字设备之间的连接来实现自动化和互联互通的网络。无线传感器、云计算和大数据分析等技术,物联网使设备能够相互交流和共享信息,实现智能化的自动化操作…

.Net6 Core Web API 配置 log4net + MySQL

目录 一、导入NuGet 包 二、添加配置文件 log4net.config 三、创建MySQL表格 四、Program全局配置 五、帮助类编写 六、效果展示 小编没有使用依赖注入的方式。 一、导入NuGet 包 ---- log4net 基础包 ---- Microsoft.Extensions.Logging.Log4Net…

K8s集群安全机制

1.访问K8s集群的时候,需要经过三个步骤完成具体操作 (1)认证(2)鉴权(授权)(3)准入控制 进行访问的时候,过程中都要经过apiserver,apiserver做统…

Docker与DevOps的无敌组合,引爆你的创新潜能

🏆荣誉认证:51CTO博客专家博主、TOP红人、明日之星;阿里云开发者社区专家博主、技术博主、星级博主。 💻微信公众号:iOS开发上架 📌本文由iOS开发上架原创! 🎉欢迎关注🔎…

【网络编程·传输层】UDP和TCP的报头

目录 一、端口号划分 二、部分指令 1、pidof(用于查看进程id) 2、netstat(查看网络状态) 三、UDP协议 1、UDP协议格式 2、UDP协议如何进行封装、解包、分用 2.1封装、解包 2.2分用 3、UDP协议的特点 3.1UDP协议的特点 …

C# 控制台彩色深度打印 工具类

文章目录 前言Nuget 环境安装代码使用打印结果 总结 前言 有时候我们想要靠打印获得程序信息,因为Dubeg模式需要一点一点断点进入进出,但是我们觉得断点运行实在是太慢了,还是直接打印后找结果会好一点。 Nuget 环境安装 想自己写的话可以看…

试卷去手写内容在线擦除,使用这个方法轻松达成

在数字时代,越来越多的人开始使用电子设备来完成日常任务。即使在考试时,许多学生也选择使用电子设备来写答案,而不是在试卷上手写。然而,有时候我们需要手写答案,但当我们想要更改或者擦除时,这将是一个麻…

TypeScript 类型断言

TypeScript 类型断言 简单来说类型断言就是 使用as关键词 强行指定获取到的结果类型 应用场景 // 类型断言: 强行指定获取到的结果类型// 应用场景// 页面上有一个 id 为 link 的 a 标签// 我们知道它是 a 标签// 但是 TS 不知道 // document.getElementById 的返回值是 HTMLE…

区块链实验室(17) - FISCO BCOS的P2P网络层分析

首先启动FISCO BCOS的示例网络,即4个节点的强连通网络。每个节点与其余3个节点存在网络连接。 打开控制台,可以看到当前有21个区块。 其中1个节点的P2P端口是30301,监测这个节点的端口。 该端口的部分流量见下图所示。白底部分是某1秒钟接收到…

f12 CSS网页调试_css样式被划了黑线怎么办

我的问题是这样的 class加上去了,但是样式不生效,此时可能是样式被其他样式覆盖了, 解决方案就是 给颜色后边添加一个!important

IDEA中怎么使用git下载项目到本地,通过URL克隆项目(giteegithub)

点击 新建>来自版本控制的项目 点击后会弹出这样一个窗口 通过URL拉取项目代码 打开你要下载的项目仓库 克隆>复制 gitee github也是一样的 返回IDEA 将刚刚复制的URL粘贴进去选择合适的位置点击克隆 下载完成

Java方法重写

目录 1.什么是方法重写 2.方法重写的规则 3.重写与重载的区别 1.什么是方法重写 重写(override,也称为覆盖):在子类中对父类中允许访问的方法的实现过程进行重新编写,子类中方法的名称、返回值类型、参数列表与父类…