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)通常由以下几个主要组件组成:
-
输入层(Input Layer):接收原始输入数据(例如图像)的层。输入层的尺寸和通道数与输入数据的特征维度相对应。
-
卷积层(Convolutional Layer):卷积层是CNN的核心组件。它由一系列卷积核(滤波器)组成,每个卷积核负责检测输入特征中的某种局部模式。卷积层通过卷积操作提取输入数据的特征,并生成一系列特征图。
-
激活函数层(Activation Layer):在卷积层后面通常会应用激活函数,如ReLU(修正线性单元),以引入非线性特性。激活函数层对每个特征图上的每个元素进行逐元素的非线性变换。
-
池化层(Pooling Layer):池化层用于减小特征图的空间尺寸,并保留重要的特征。常见的池化操作包括最大池化和平均池化,通过降低空间分辨率来减少参数数量和计算量。
-
全连接层(Fully Connected Layer):全连接层将前面的卷积层和池化层的输出转换为分类或回归所需的向量形式。每个神经元与上一层的所有神经元相连接,通过学习权重和偏置来进行特征组合和分类。
-
输出层(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
相关文章:

pytorch学习——卷积神经网络——以LeNet为例
目录 一.什么是卷积? 二.卷积神经网络的组成 三.卷积网络基本元素介绍 3.1卷积 3.2填充和步幅 3.2.1填充(Padding) 填充是指在输入数据周围添加额外的边界值(通常是零),以扩展输入的尺寸。填充可以在卷…...

stm32 mpu6050 cubemx DMP法读取角度
文章目录 前言一、相关文件二、cubemx配置三、代码变量初始化主循环 总结 前言 文件 记录使用dmp库来读取mpu6050的角度。 这是参考文件 参考1–主要参考 github参考 参考2 参考三 一、相关文件 相关文件在这里下载(未填,不过可以在上面的git中下载&a…...

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

校园跑腿小程序运营攻略
作为一名校园跑腿小程序的运营者,你可能会面临诸如用户获取、平台推广、服务质量保证等挑战。在本篇推文中,我将为你提供一些关键的运营策略,帮助你成功运营校园跑腿小程序。 1. 用户获取和留存 用户是校园跑腿小程序成功的关键。以下是一些…...

InfluxDB2如何求增量数据
需求 项目中需要接入电表设备,求用电量。 按天和设备统计用电量 按天统计用电量 统计总用电量 存在的问题 difference 函数可以求增量,但是以上计算均存在一个问题,比如xx设备有8.1号和8.2号的数据,我统计每天的用电量…...

Flink作业调度的9种状态
1.什么是作业调度 Flink 通过 Task Slots 来定义执行资源。每个 TaskManager 有一到多个 task slot,每个 task slot 可以运行一条由多个并行 task 组成的流水线。 这样一条流水线由多个连续的 task 组成,比如并行度为 n 的 MapFunction 和 并行度为 n 的…...
8、Kubernetes核心技术 - ConfigMap
目录 一、ConfigMap概述 二、ConfigMap创建 2.1、命令行方式创建 2.2、yaml 文件方式创建 三、ConfigMap查询 四、ConfigMap更新 4.1、kubectl edit方式 4.2、kubectl apply方式 五、ConfigMap使用 5.1、spec.env 【环境变量】 5.2、spec.envFrom 【环境变量】 5.3…...

音视频--DTMF信号发送及检测
参考资料 https://zh.wikipedia.org/wiki/%E5%8F%8C%E9%9F%B3%E5%A4%9A%E9%A2%91https://www.cnblogs.com/lijingcheng/p/4454932.html 1. DTMF是什么 1.1 DTMF定义 双音多频信号(英语:Dual-Tone Multi-Frequency,简称:DTMF&a…...

阿里云容器服务助力极氪荣获 FinOps 先锋实践者
作者:海迩 可信云评估是中国信息通信研究院下属的云计算服务和软件的专业评估体系,自 2013 年起历经十年发展,可信云服务评估体系已日臻成熟,成为政府支撑、行业规范、用户选型的重要参考。 2022 年 5 月国务院国资委制定印发《…...
C++ 通过time.windows.com获取时间
C++ 通过time.windows.com获取时间 在C++中,你可以使用 <ctime>头文件中的 time()函数来获取当前的系统时间。然后,你可以使用 <ctime>头文件中的 localtime()函数将时间转换为本地时间,并从中获取小时、分钟和秒。 以下是一个示例代码,演示如何通过time.windo…...

MPLAB加载c文件为什么不能添加到工程中的source files中
MPLAB加载c文件为什么不能添加到工程中的source files中 因为你安装好MAPLAB软件之后你的编译器是默认的编译器,所以当你添加C文件时,软件是不认识C文件的,只有手动的将编译器改成自安装的PICC编译器才能进行C文件的正确加载。 具体修改步骤…...

Tcp的粘包和半包问题及解决方案
目录 粘包: 半包: 应用进程如何解读字节流?如何解决粘包和半包问题? ①:固定长度 ②:分隔符 ③:固定长度字段存储内容的长度信息 粘包: 一次接收到多个消息,粘包 应…...

路由的hash和history模式的区别
目录 ✅ 路由模式概述 一. 路由的hash和history模式的区别 1. hash模式 2. history模式 3. 两种模式对比 二. 如何获取页面的hash变化 ✅ 路由模式概述 单页应用是在移动互联时代诞生的,它的目标是不刷新整体页面,通过地址栏中的变化来决定内容区…...

CS5366+VL171母座正反插HDMI(CS5466也可搭配)国产芯片TYPEC方案设计 ASL电路原理图 集睿致远+威锋设计
VL171是威锋芯片,可搭配ASL集睿致远CS5366设计TypeC母座正反插转HDMI高清投屏方案,CS5366是2lane 芯片,支持4K60HZ,是CS5266的升级版,CS5366设计拓展坞方案可以替代CS5266携带快充100W的PD和US,多口HUB也不在话下,而画面的刷新率和…...
mxgraph的核心元素详谈
前言: MxGraph是一个流行的开源图形库,它提供了一stop solution for creating graphical representations of data。下面是MxGraph的核心源码讲解: 正文: Graph Structure(图结构): MxGraph将一个图表示为一个层次结构,由节点和边组成。节点表示图中的顶点,而边表示它…...

再探C++——默认成员函数
目录 一、构造函数 二、析构函数 三、赋值运算符 四、拷贝构造 如果一个类中没有成员,我们称为空类。空类,也存在6个默认的类成员函数。 默认成员函数:用户不显示地写,编译器会默认生成的函数叫做默认成员函数。 6个默认成员…...

推荐两款github敏感信息搜集工具(gsil、gshark)
推荐两款github敏感信息搜集工具(gsil、gshark) - 云社区 - 腾讯云 (tencent.com) github敏感信息泄露是很多企业时常忽视的一个问题,国外有一份研究报告显示,在超过24,000份的GitHub公开数据中,发现有数千个文件中可能…...
如何不拷贝资源的使用fork
我们知道fork出的子进程会把父线程的资源拷贝一遍,其中包括文件描述符表,如果是一些独占的设备,那么经常会出问题。 比如你在父进程ose了设备,但子进程的文件描述符表里依然记录是open的,这样当你再次在父进程open时&a…...

使用事件侦听器和 MATLAB GUI 查看 Simulink 信号研究
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
使用协程让物体颜色慢慢消失
以下是使用协程让物体颜色慢慢消失的完整代码,每行都有注释说明: using UnityEngine; using System.Collections;public class ExampleClass : MonoBehaviour {public SpriteRenderer sprite; // 物体的SpriteRenderer组件public float fadeSpeed 0.1f…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...