一些经典的神经网络(第17天)

news2024/10/13 4:19:30

1. 经典神经网络LeNet

LeNet是早期成功的神经网络;
先使用卷积层来学习图片空间信息
然后使用全连接层来转到到类别空间
在这里插入图片描述

【通过在卷积层后加入激活函数,可以引入非线性、增加模型的表达能力、增强稀疏性和解决梯度消失等问题,从而提高卷积神经网络的性能和效果】

LeNet由两部分组成:卷积编码器和全连接层密集块

import torch
from torch import nn
from d2l import torch as d2l

class Reshape(torch.nn.Module):
    def forward(self, x):
        return x.view(-1, 1, 28, 28) # 批量数不变,通道数=1,h=28, w=28

net = torch.nn.Sequential(Reshape(), 
                          nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(), # 在卷积后加激活函数,填充是因为原始处理数据是32*32
                          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(), # 将4D结果拉成向量
                          # 相当于两个隐藏层的MLP
                          nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
                          nn.Linear(120, 84), nn.Sigmoid(), 
                          nn.Linear(84, 10))

检查模型

X = torch.rand(size=(1, 1, 28, 28), dtype=torch.float32)
for layer in net:
    X = layer(X) 
    """
    对神经网络 net 中的每一层进行迭代,并打印每一层的输出形状
    layer.__class__.__name__ 是获取当前层的类名,即层的类型
    """
    print(layer.__class__.__name__, 'output shape: \t', X.shape)

在这里插入图片描述
LeNet在Fashion-MNIST数据集上的表现

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

# 对evaluate_accuarcy函数进行轻微的修改
def evaluate_accuracy_gpu(net, data_iter, device=None):  
    """使用GPU计算模型在数据集上的精度。"""
    if isinstance(net, torch.nn.Module):
        net.eval()
        if not device:
            device = next(iter(net.parameters())).device
    metric = d2l.Accumulator(2)
    for X, y in data_iter:
        if isinstance(X, list):
            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]  # 分类正确的个数 / 总个数


net.to(device) 是将神经网络 net 中的所有参数和缓冲区移动到指定的设备上进行计算的操作。

net 是一个神经网络模型。device 是指定的设备,可以是 torch.device 对象,如 torch.device(‘cuda’) 表示将模型移动到 GPU 上进行计算,或者是字符串,如 ‘cuda:0’ 表示将模型移动到指定编号的 GPU 上进行计算,也可以是 ‘cpu’ 表示将模型移动到 CPU 上进行计算。
通过调用 net.to(device),模型中的所有参数和缓冲区将被复制到指定的设备上,并且之后的计算将在该设备上进行。这样可以利用 GPU 的并行计算能力来加速模型训练和推断过程。
注意,仅仅调用 net.to(device) 并不会对输入数据进行迁移,需要手动将输入数据也移动到相同的设备上才能与模型进行计算。例如,可以使用 input = input.to(device) 将输入数据 input 移动到指定设备上。】

# 为了使用 GPU,我们还需要一点小改动
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) # 将神经网络 net 中的所有参数和缓冲区移动到指定的设备上进行计算的操作
    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) # metric被初始化为存储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())

在这里插入图片描述

2. 深度卷积神经网络(AlexNet)

在这里插入图片描述
在这里插入图片描述
AlexNet架构 VS LeNet:
更大的核窗口和步长,因为图片更大了
更大的池化窗口,使用maxpooling
更多的输出通道
添加了3层卷积层
更多的输出

更多细节:

  • 激活函数从sigmod变成了Rel(减缓梯度消失)
  • 隐藏全连接层后加入了丢弃层dropout
  • 数据增强

总结:

  • AlexNet是更大更深的LeNet,处理的参数个数和计算复杂度大幅度提升
  • 新加入了丢弃法,ReLU激活函数,最大池化层和数据增强

代码实现:

import torch
from torch import nn
from d2l import torch as d2l

net = nn.Sequential(
    nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(), # 在MNIST输入通道是1,在ImageNet测试集上输入为3
    nn.MaxPool2d(kernel_size=3, stride=2),
    nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(), # 相比于LeNet将激活函数改为ReLU
    nn.MaxPool2d(kernel_size=3, stride=2),
    nn.Conv2d(256, 384, kernel_size=3, padding=1), nn.ReLU(),
    nn.Conv2d(384, 384, kernel_size=3, padding=1), nn.ReLU(),
    nn.Conv2d(384, 256, kernel_size=3, padding=1), nn.ReLU(),
    nn.MaxPool2d(kernel_size=3, stride=2), 
    nn.Flatten(), # 将4D->2D
    nn.Linear(6400, 4096), nn.ReLU(), nn.Dropout(p=0.5), # 添加丢弃
    nn.Linear(4096, 4096), nn.ReLU(), nn.Dropout(p=0.5),
    nn.Linear(4096, 10)) # 在Fashion-MNIST上做测试所以输出为10
# 构造一个单通道数据,来观察每一层输出的形状
X = torch.randn(1, 1, 224, 224)
for layer in net:
    X = layer(X)
    print(layer.__class__.__name__, 'Output shape:\t', X.shape)

在这里插入图片描述

# Fashion-MNIST图像的分辨率低于ImageNet图像,所以将其增加到224x224
batch_size = 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
# 训练AlexNet
lr, num_epochs = 0.01, 10
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

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

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

相关文章

集成学习方法(随机森林和AdaBoost)

释义 集成学习很好的避免了单一学习模型带来的过拟合问题 根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类: Bagging(个体学习器间不存在强依赖关系、可同时生成的并行化方法) 流行版本:随机森林(random forest)Boosting(个体…

8.strtok函数

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h>int main() {/*----------------------函数解析----------------------*//*函数原型&#xff1a;char* strtok(char* str, char const* sep)*//*函数入参&#xff1a;第一个参数是要分割的…

Layui 主窗口调用 iframe 弹出框模块,获取控件的相应值

var iframeWindow window[layui-layer-iframe index]; iframeWindow.layui.tree............(这里就可以操作tree里面的内容了)。var chrild layero.find(iframe).contents(); chrild.layui.tree (这样是调用不到的)。var child layer.getChildFrame(); child.layui.tree(这…

Linux常见指令及热键

文章目录 1. ls 指令语法实例 2. pwd 指令语法实例 3. cd 指令语法实例 4. touch 指令语法实例 5. mkdir语法实例 6. rmdir 指令语法实例 7. rm 指令语法实例 8. man 指令语法实例 9. cp 指令语法实例 10. mv 指令语法实例 11. cat 指令使用权限语法格式参数说明&#xff1a;实…

【Java系列】Java 简介

目录 Java 简介主要特性发展历史Java 开发工具系列文章版本记录 Java 简介 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发&#xff0c;并在 1995 年正式推出。 后来 Sun 公司被 Ora…

Android apkanalyzer简介

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、用法3.1 使用 Android Studio3.1.1…

Arduino Nano 引脚复用分析

近期开发的项目为气体传感器采集仪&#xff0c;综合需求&#xff0c;选取NANO作为主控&#xff0c;附属设备有 oled、旋转编码器、H桥板、蠕动泵、开关、航插等&#xff0c;主要是用现有接口怎么合理配置实现功能。 不管stm32 还是 Arduino 都要看清引脚图 D2 D3 引脚是两个外…

abap中程序跳转(全)

1.常用 1.CALL TRANSACTION 1.CALL TRANSACTION ta WITH|WITHOUT AUTHORITY-CHECK [AND SKIP FIRST SCREEN]. 其中ta为事务码tcode使用时要打单引号() 2. CALL TRANSACTION ta WITH|WITHOUT AUTHORITY-CHECK USING bdc_tab { {[MODE mode] [UPDATE u…

【JavaEE】浅谈死锁

1、什么是死锁&#xff1f; 死锁是这样一种情形&#xff1a;多个线程同时被阻塞&#xff0c;它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞&#xff0c;因此程序不可能正常终止。 2、关于死锁的情况 2.1 一个线程一把锁&#xff0c;可重入锁没事。不…

Jmeter压测入门教程

目录 1.Jmeter安装与启动 2.Jmeter使用步骤 3.结果分析 1.Jmeter安装与启动 安装 1. 首先进入官网Apache JMeter - Download Apache JMeter 2. 选择操作系统所对应的版本进行下载。 3.将下载成功的压缩包解压到指定目录当中&#xff0c;即安装成功。 4. 右键“我的电脑”…

spring6-资源操作:Resources

资源操作&#xff1a;Resources 1、Spring Resources概述2、Resource接口3、Resource的实现类3.1、UrlResource访问网络资源3.2、ClassPathResource 访问类路径下资源3.3、FileSystemResource 访问文件系统资源3.4、ServletContextResource3.5、InputStreamResource3.6、ByteAr…

程序员必备的IP查询工具

shigen坚持日更的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。坚持记录和分享从业两年以来的技术积累和思考&#xff0c;不断沉淀和成长。 hello&#xff0c;今天shigen给大家分享一下如何优雅的查询IP的工具。我们先看一下效果&a…

LeetCode 1361. 验证二叉树【二叉树,DFS或BFS或并查集】1464

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

Yakit工具篇:端口探测和指纹扫描的配置和使用

简介&#xff08;来自官方文档&#xff09; 端口扫描和指纹识别是渗透测试和网络安全领域中常用的基础技术之一&#xff0c;用于评估目标系统的安全性和发现可能存在的漏洞和攻击面。也是Yakit基础工具的模块之一。 端口扫描 是指通过扫描目标系统上的端口&#xff0c;确定哪…

一步步掌握Java IO的奥秘:深入学习BIO、NIO,实现客户端与服务器通信

众所周知&#xff0c;Java IO是一个庞大的知识体系&#xff0c;很多人在学习的过程中会感到迷茫&#xff0c;甚至学得一头雾水&#xff0c;而我也曾有同样的困惑。因此&#xff0c;本文的目标是帮助大家一步一步深入学习Java IO&#xff0c;从BIO开始&#xff0c;然后引出JDK1.…

React +AntD + From组件重复提交数据(已解决)

开发场景&#xff1a; react Hooks andt 提交form表单内容给数据库(使用antd的form组件) 问题描述 提交是异步的&#xff0c;请提交方式是POST 方式 提交表单内容给后端&#xff0c;却产生了两次提交记录&#xff08;当然&#xff0c;数据新增了两条数据&#xff09;。可以…

智能加压站远程监控与维护,提高小区供水效率与安全性的创新方案

不知道大家有没有遇到过这样的情况&#xff1a;当你在家中使用水龙头接水时&#xff0c;突然水管的水流就逐渐变细直到消失。正当你震惊带着一丝疑惑是否停水的时候&#xff0c;水流又开始由细变粗&#xff0c;仿佛在和你开玩笑一样。 实际上&#xff0c;这种情况的出现通常是由…

汽车屏类产品(一):流媒体后视镜Camera Monitoring System (CMS)

前言: CMS,有叫电子侧视镜,虚拟倒车镜,电子倒车镜, 电子取代镜等,ISO 国际标准组织称其为摄像头监控系统。电子后视镜由“摄像头+屏幕”组成,汽车外后视镜经历了光学镜面从平面镜到曲面镜的迭代进步,CMS也实现从商用车到乘用车的过渡。显示模式为外部摄像头采集图像,…

小白学习c++的的一节课

初识c 目录&#xff1a;一、c关键字(c98)二、命名空间2.1 命名空间的定义2.2 命名空间的使用 三、c输入与输出四、缺省参数五、函数重载六、引用6.1引用特性6.2常引用6.3使用场景6.4传值和传引用效率比较6.5引用和指针的区别 七、内联函数7.1 概念7.2特性 八、auto关键字&…