【动手学深度学习】--11.经典卷积神经网络 LeNet

news2024/11/26 6:24:15

文章目录

  • 经典卷积神经网络 LeNet
    • 1.LeNet
    • 2.代码实现
    • 3.模型训练

经典卷积神经网络 LeNet

学习视频:经典卷积神经网络 LeNet【动手学深度学习v2】

官方笔记:卷积神经网络(LeNet)

1.LeNet

image-20230719095408080

总体来看,LeNet(LeNet-5)由两个部分组成:

  • 卷积编码器:由两个卷积层组成;
  • 全连接层密集块:由三个全连接层组成。

image-20230719095439542

image-20230719095821975

总结:

  • LeNet是早期成功的神经网络
  • 先使用卷积层来学习图片空间信息
  • 然后使用全连接层来转换到类别空间

2.代码实现

通过下面的LeNet代码,可以看出用深度学习框架实现此类模型非常简单。我们只需要实例化一个Sequential块并将需要的层连接在一起。

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(),
    nn.Linear(120, 84), nn.Sigmoid(),
    nn.Linear(84, 10))

我们将一个大小为28×28的单通道(黑白)图像通过LeNet。通过在每一层打印输出的形状,我们可以检查模型,以确保其操作与我们期望的一致,由于图像是黑白的,所有channle数为1

image-20230719095903499

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)

image-20230719095924264

请注意,在整个卷积块中,与上一层相比,每一层特征的高度和宽度都减小了。 第一个卷积层使用2个像素的填充,来补偿5×5卷积核导致的特征减少。 相反,第二个卷积层没有填充,因此高度和宽度都减少了4个像素。随着层叠的上升,通道的数量从输入时的1个,增加到第一个卷积层之后的6个,再到第二个卷积层之后的16个。 同时,每个汇聚层的高度和宽度都减半。最后,每个全连接层减少维数,最终输出一个维数与结果分类数相匹配的输出

nn.Con2d()函数详解、nn.AvgPool2d详解

3.模型训练

现在我们已经实现了LeNet,让我们看看LeNet在Fashion-MNIST数据集上的表现。

batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size=batch_size)

虽然卷积神经网络的参数较少,但与深度的多层感知机相比,它们的计算成本仍然很高,因为每个参数都参与更多的乘法。 通过使用GPU,可以用它加快训练。

为了进行评估,对softmax回归中描述的evaluate_accuracy函数进行轻微的修改。 由于完整的数据集位于内存中,因此在模型使用GPU计算数据集之前,我们需要将其复制到显存中。

def evaluate_accuracy_gpu(net, data_iter, device=None): #@save
    """使用GPU计算模型在数据集上的精度"""
    if isinstance(net, nn.Module):
        net.eval()  # 设置为评估模式
        if not device:
            device = next(iter(net.parameters())).device
    # 正确预测的数量,总预测的数量
    metric = d2l.Accumulator(2)
    with torch.no_grad():
        for X, y in data_iter:
            if isinstance(X, list):
                # BERT微调所需的(之后将介绍)
                X = [x.to(device) for x in X]
            else:
                X = X.to(device)
            y = y.to(device)
            metric.add(d2l.accuracy(net(X), y), y.numel())
    return metric[0] / metric[1]

由于我们将实现多层神经网络,因此我们将主要使用高级API。 以下训练函数假定从高级API创建的模型作为输入,并进行相应的优化。使用Xavier随机初始化模型参数。 与全连接层一样,我们使用交叉熵损失函数和小批量随机梯度下降。

#@save
def train_ch6(net, train_iter, test_iter, num_epochs, lr, device):
    """用GPU训练模型(在第六章定义)"""
    def init_weights(m):
        if type(m) == nn.Linear or type(m) == nn.Conv2d:
            nn.init.xavier_uniform_(m.weight)
    net.apply(init_weights)
    print('training on', device)
    net.to(device)
    optimizer = torch.optim.SGD(net.parameters(), lr=lr)
    loss = nn.CrossEntropyLoss()
    animator = d2l.Animator(xlabel='epoch', xlim=[1, num_epochs],
                            legend=['train loss', 'train acc', 'test acc'])
    timer, num_batches = d2l.Timer(), len(train_iter)
    for epoch in range(num_epochs):
        # 训练损失之和,训练准确率之和,样本数
        metric = d2l.Accumulator(3)
        net.train()
        for i, (X, y) in enumerate(train_iter):
            timer.start()
            optimizer.zero_grad()
            X, y = X.to(device), y.to(device)
            y_hat = net(X)
            l = loss(y_hat, y)
            l.backward()
            optimizer.step()
            with torch.no_grad():
                metric.add(l * X.shape[0], d2l.accuracy(y_hat, y), X.shape[0])
            timer.stop()
            train_l = metric[0] / metric[2]
            train_acc = metric[1] / metric[2]
            if (i + 1) % (num_batches // 5) == 0 or i == num_batches - 1:
                animator.add(epoch + (i + 1) / num_batches,
                             (train_l, train_acc, None))
        test_acc = evaluate_accuracy_gpu(net, test_iter)
        animator.add(epoch + 1, (None, None, test_acc))
    print(f'loss {train_l:.3f}, train acc {train_acc:.3f}, '
          f'test acc {test_acc:.3f}')
    print(f'{metric[2] * num_epochs / timer.sum():.1f} examples/sec '
          f'on {str(device)}')

训练和评估LeNet-5模型

lr, num_epochs = 0.9, 10
train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

image-20230719103043072

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

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

相关文章

SpringBoot如何启用/禁用执行器?

SpringBoot如何启用/禁用执行器? 一、什么是SpringBoot执行器二、如何启用SpringBoot执行器三、如何禁用SpringBoot执行器 一、什么是SpringBoot执行器 在Spring Boot中,执行器(Actuator)是一个用于监控和管理应用程序的功能模块…

关于WIN10创建系统映像时D盘为系统盘的解决方案

文章目录 问题:使用WIN10自带备份工具时,创建系统映像时,D盘被识别为系统盘的解决方案。方法一(传统方法,删盘符)方法二(对症下药,找原因)第一个选项是暂时将服务的Image…

Nature Neuroscience:慢波、纺锤波和涟波耦合如何协调人类睡眠期间的神经元加工和通信

摘要 学习和可塑性依赖于休息期间神经元回路的微调调节。一个尚未解决的难题是,在没有外部刺激或有意识努力的情况下,睡眠中的大脑如何协调神经元的放电率(FRs)以及神经回路内外的通信,以支持突触和系统巩固。利用颅内脑电图对人类海马体和周…

SuperGlue学习记录之最优传输

在进行最优传输相关理论的学习过程中,找到SuperGlue这篇论文,该篇论文通过最优传输来完成特征点的匹配过程。 SuperGlue结构 先来看一下其结构: 首先将两张图片送入特征提取网络,通过卷积网络提取出特征,主要有四个值…

Windows特殊名称文件夹删除

问题描述: 使用React开发的前端项目,指定build输出路径是创建出了俩个特殊的文件夹 .. build 咋一看build显得很正常,那你是没看见同时出现了俩个build: 尝试使用 dir /x rd /S /Q 等删除目录无果 尝试下载删除文件夹的工具也没…

【windows测试通过】关于Godot导入外部音频文件的问题

file.open(filepath, file.READ) var buffer file.get_buffer(file.get_len()) #put data into audiostreamsample var stream AudioStreamSample.new() stream.data buffer 代码给出,还没有测试过。(godot3.2测试未通过) 在运行时轻松加载外部音频…

大数据传输安全风险与预防措施

随着互联网技术的快速发展和大数据时代的到来,大数据传输已成为越来越重要的环节。但由于网络传输过程中存在着各种安全风险,这些风险极有可能会导致机密数据泄露、网络攻击等问题,对企业和个人的信息安全造成潜在的威胁。因此,保…

【个人笔记】对linux中一切皆文件的理解与ls命令

目录 Linux中一切皆文件ls命令常用参数常用命令lscpu lspci Linux中一切皆文件 理解参考:为什么说:Linux中一切皆文件? ls命令 ls(英文全拼: list directory contents)命令用于显示指定工作目录下之内容…

数据可视化组件有什么用?

数据可视化组件在数据分析中扮演着至关重要&角色。 通过图表、图形和交互式界面,数据可视化组件帮助将复杂的数据转化为易于理解的视觉展示。这种形式的数据呈现有助于发现模式、趋势和异常,并能够快速有效地传达数据的含义和洞察。 下面简单举两个…

volatile 关键字 (详细解析)

目录 前置知识 共享变量不可见性 JMM volatile 关键字 使用volatile关键字 加锁 volatile 关键字 -- 更深入的问题 volatile不保证原子性 volatile禁止指令重排序 前置知识 共享变量不可见性 在多线程并发执行下,多个线程修改共享的成员变量&#xff0…

Android自动化测试之uiautomator2使用

uiautomator2是uiautomator的升级版本,增加了对AccessibilityService服务的支持,当然在appium1.7版本以上进行支持,本篇文章介绍一下它的使用。 安装 安装方式很简单: pip install uiautomator2 进行初始化: pyth…

java版Spring Cloud+Spring Boot+Mybatis+uniapp 企业电子招投标采购系统源码

随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审计监督要…

zabbix 企业级监控(2) 监控linux主机

目录 配置开始 Zabbix添加linux主机 4.为agent.zabbix.com添加模板 环境: (隔天做的更换了IP,不影响实际操作) IP 192.168.50.50 关闭防火墙规则 更改主机名 [rootlocalhost ~]# vim /etc/hostname agent.zabbix.com [rootloca…

myAgv智能移动底盘的slam算法学习以及动态避障

前言 随着科技得越来越发达,人工智能,自动驾驶导航等字眼频频出现在我们得眼前。但是目前来说自动驾驶并没有得到很全面得普及,还在进行不断的开发和测试当中。从小就爱好车的我,对这项技术也很是感兴趣。 偶然间在上网的时候买…

spring注解开发-spring12

如果使用注解开发,就不需要了写 再测试,也无误 如果你只写类型,只写autowired 如果按照名称注入,你不仅写autowired,还要靠内fea尔 Resource也可以完成注入: 同样是注入bean中id的值 现在我们使用Value…

OpenCV+VS 环境配置(以OpenCV4.7.0+VS2022环境配置为例)

下面以4.7.0版本的OpenCV与VS2022的环境配置为例进行介绍,其他版本的OpenCV与VS的环境配置也可参考本流程。 1.安装OpenCV库 下载网址:https://opencv.org/releases/ 2.配置环境设置 2.1 系统环境变量 1.右击桌面的此电脑图标,点击属性→…

Jsonpath - 数据中快速查找和提取的强大工具

JSON(JavaScript Object Notation)在现代应用程序中广泛使用,但是如何在复杂的JSON数据中 查找和提取所需的信息呢?JSONPath是一种功能强大的查询语言,可以通过简单的表达式来快速准确地定位和提取JSON数据。本文将介绍…

HarmonyOS/OpenHarmony应用开发-Stage模型UIAbility组件使用(五)

UIAbility组件间交互(设备内) UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时,会涉及到启动特定的UIAbility,该UIAbility可以是应用内的其他UIAbility,也可以是其他应用的UIAbility(例如启动…

飞行动力学 - 第11节-纵向静稳定性及各部件贡献 之 基础点摘要

飞行动力学 - 第11节-纵向静稳定性及各部件贡献 之 基础点摘要 1. 气流角2. 操纵面偏角3. 系数的符号4. 纵向、横向、航向稳定性5. 纵向静稳定性5.1 定义5.2 准则5.3 举例5.4 假设5.5 分析5.5.1 机身贡献5.5.2 机翼贡献5.5.3 尾翼贡献 6. 参考资料 1. 气流角 迎角:…

第二章 表的操作与数据类型

第二章 表的操作 一、表的创建(1)语法(2)示例 二、查看库中所有表以及具体表结构(1)语法(2)示例 三、表的修改(1)语法(2)示例 四、表的…