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

news2024/9/23 1:39:31

目录

一.什么是卷积?

二.卷积神经网络的组成

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

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 d2l

def corr2d(X, K):  #@save
    """计算二维互相关运算"""
    h, w = K.shape
    Y = 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(),  # 全连接层1
    nn.Linear(120, 84), nn.Sigmoid(),  # 全连接层2
    nn.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.coloradmin.cn/o/834394.html

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

相关文章

重磅特性 - SpreadJS推出新插件甘特图,预览版下载体验中

摘要:本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 甘特图对于业务场景中的工程项目管理、预算执行、生产计划等都能将原有的表格数据&…

【数据分析】numpy (二)

numpy作为数据分析,深度学习常用的库,本篇博客我们来介绍numpy的一些进阶用法: 一,numpy的常用简单内置函数: 1.1求和: a np.array([[1, 2],[3, 4]]) np.sum(a)10 1.2求平均值: np.mean(a…

《向量数据库》——怎么安装向量检索库Faiss?

装 Faiss 以下教程将展示如何在 Linux 系统上安装 Faiss: 1. 安装 Conda。 在安装 Faiss 之前,先在系统上安装 Conda。Conda 是一个开源软件包和环境管理系统,可在 Windows、macOS 和 Linux 操作系统上运行。根据以下步骤在 Linux 系统上安装 Conda。 2. 从官网…

[模拟电路]集成运算放大器

目录 一.前言二.集成运放的介绍及特性分析1.集成运算放大器2.集成运放由四个部分组成3.集成运放的特性 三.集成运放的线性应用(引入负反馈)1.两个基本运算电路——反相/同相比例运算电路2.同相比例运算电路的特例——电压跟随器3.反相加法运算电路4.同相…

Android组件化入门:一步步搭建组件化架构

1、前言 最近因为业务需求变更,有考虑采用组件化架构进行开发,这方面我之前没有接触过。关于组件化的文章很多,各方大神更是提出了各种的组件化方案,我也看了很多相关文章。但是学习新东西看的再多,不如动手做一次&am…

CAD产品设计逆向软件 FARO RevEng Crack

CAD产品设计逆向软件 FARO RevEng 软件平台能为用户带来全面的数字设计体验。该反向工程软件有助于利用三维点云创建和编辑高质量的网格和 CAD 表面,以实现反向工程工作流程。然后,工业设计师可以利用这些网格模型进行进一步设计或三维打印。 RevEng 的商…

element-ui分页编辑器的使用

代码: 准备好初始数据; total: ,page: {pageSize: 1,pageNumber: 10,}, 当前显示在第一页,每页10条数据。 一,页码改变的事件 handleCurrentChange(val) { this.page.pageSizeval 通过传入(this.page) 获取当前页的数据 } 二.页容量改变 handleSizeChange(val) …

剑指offer49.丑数

看完题想了一下,就想到了一点,它就是先用1分别乘2,乘3,乘5然后往后加,然后用2分别乘2,乘3,乘5往后加,但是如果这样就是1,2,3,5,4&…

更快的训练和推理: 对比 Habana Gaudi®2 和英伟达 A100 80GB

🤗 宝子们可以戳 阅读原文 查看文中所有的外部链接哟! 通过本文,你将学习如何使用 Habana Gaudi2 加速模型训练和推理,以及如何使用 🤗 Optimum Habana 训练更大的模型。然后,我们展示了几个基准测例&#…

春秋云镜 CVE-2020-5515

春秋云镜 CVE-2020-5515 Gila CMS 1.11.8 sql注入 靶标介绍 Gila CMS是一套基于PHP和MySQL的开源内容管理系统(CMS)。 Gila CMS 1.11.8版本中的/admin/sql?query存在SQL注入漏洞。该漏洞源于基于数据库的应用缺少对外部输入SQL语句的验证。攻击者可利…

【零基础学Rust | 基础系列 | 基础语法】变量,数据类型,运算符,控制流

文章目录 简介:一,变量1,变量的定义2,变量的可变性3,变量的隐藏 二、数据类型1,标量类型2,复合类型 三,运算符1,算术运算符2,比较运算符3,逻辑运算…

KVM+SAN 如何实现多个主机访问同一个卷组

KVMSAN存储 KVM宿主机的HBA卡通过光纤线 <-----> 光纤交换机 <-----> SAN存储 联想SAN存储&#xff1a; 1、创建卷组 可使用卷组来创建可供主机访问的一个或多个卷。卷组是具有共同特性&#xff08;如 RAID 级别和容量&#xff09;的卷的容器。 2、创建卷 可创…

vue el-input 使用 回车键会刷新页面的问题

场景&#xff1a; vue项目中 在输入框输入字符并按下回车键搜索时&#xff0c;不会进行搜索&#xff0c; 而是会刷新页面 原因&#xff1a; 当form表单中只有一个input时&#xff0c;按下回车建会自动触发页面的提交功能&#xff0c; 产生刷新页面的行为 解决&#xff1a; 在…

【Matlab】绘图代码模板

matlab绘图代码模板 matlab官方帮助文档平面基本绘图(2D):单曲线图多曲线图 官网模板单曲线图条形图误差条形图极坐标图针状图散点图3D等高线图热图 进阶版绘图好看的折线图柱状图统计直方图离散数据杆状图二维曲线二维散点图二维渐变图条形图填充图多Y轴图二维场图三维曲线图三…

“华为杯”研究生数学建模竞赛2016年-【华为杯】A题:多无人机协同任务规划

目录 摘 要&#xff1a; 1. 问题重述 1 . 1 问题背景 1 . 2 需要解决的问题 2. 模型的假设 3. 符号说明 4. 问题一&#xff08;协同侦察&#xff09; 4 . 1 问题分析及模型建立 4 . 2 问题求解 4.2.1 加载 S-1 型载荷的无人机的航迹优化 4.2.2 加载 S-2 型载荷的无人机的航迹优…

【java安全】无Commons-Collections的Shiro550反序列化利用

文章目录 【java安全】无Commons-Collections的Shiro550反序列化利用Shiro550利用的难点CommonsBeanutils1是否可以Shiro中&#xff1f;什么是serialVersionUID&#xff1f;W 无依赖的Shiro反序列化利用链POC 【java安全】无Commons-Collections的Shiro550反序列化利用 Shiro5…

【JMeter】 使用Synchronizing Timer设置请求集合点,实现绝对并发

目录 布局设置说明 Number of Simulated Users to Group Timeout in milliseconds 使用时需要注意的点 集合点作用域 实际运行 资料获取方法 布局设置说明 参数说明&#xff1a; Number of Simulated Users to Group 每次释放的线程数量。如果设置为0&#xff0c;等同…

21.Netty源码之编码器

highlight: arduino-light Netty如何实现自定义通信协议 在学习完如何设计协议之后&#xff0c;我们又该如何在 Netty 中实现自定义的通信协议呢&#xff1f;其实 Netty 作为一个非常优秀的网络通信框架&#xff0c;已经为我们提供了非常丰富的编解码抽象基类&#xff0c;帮助我…

帕累托森林:IEEE Fellow唐远炎院士出任「儒特科技」首席架构官

导语 「儒特科技」作为一家拥有全球独创性极致化微内核Web引擎架构的前沿科技企业&#xff0c;从成立即受到中科院软件所和工信部的重点孵化及扶持&#xff0c;成长异常迅速。前不久刚正式官方融入中国五大根操作系统体系&#xff0c;加速为其下游上千家相关衍生OS和应用软件企…

Dockerfile构建MySQL镜像(yum方式)

目录 Dockerfile构建MySQL镜像 1、建立工作目录 2、编写Dockerfile文件 3、构建镜像 4、测试容器 Dockerfile构建MySQL镜像 1、建立工作目录 [roothuyang1 ~]# mkdir mysql [roothuyang1 ~]# cd mysql/ 2、编写Dockerfile文件 [roothuyang1 mysql]# vim Dockerfile 配置如…