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…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...
Axure Rp 11 安装、汉化、授权
Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接:https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...
安全领域新突破:可视化让隐患无处遁形
在安全领域,隐患就像暗处的 “幽灵”,随时可能引发严重事故。传统安全排查手段,常常难以将它们一网打尽。你是否好奇,究竟是什么神奇力量,能让这些潜藏的隐患无所遁形?没错,就是可视化技术。它如…...
