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

1. 经典神经网络LeNet

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

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

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

import torch
from torch import nn
from d2l import torch as d2lclass Reshape(torch.nn.Module):def forward(self, x):return x.view(-1, 1, 28, 28) # 批量数不变,通道数=1,h=28, w=28net = torch.nn.Sequential(Reshape(), nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(), # 在卷积后加激活函数,填充是因为原始处理数据是32*32nn.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结果拉成向量# 相当于两个隐藏层的MLPnn.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())).devicemetric = 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 d2lnet = nn.Sequential(nn.Conv2d(1, 96, kernel_size=11, stride=4, padding=1), nn.ReLU(), # 在MNIST输入通道是1,在ImageNet测试集上输入为3nn.MaxPool2d(kernel_size=3, stride=2),nn.Conv2d(96, 256, kernel_size=5, padding=2), nn.ReLU(), # 相比于LeNet将激活函数改为ReLUnn.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->2Dnn.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.hqwc.cn/news/140599.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VR全景图片如何拍摄制作,拍摄制作过程中要注意什么?

引言: VR全景图片就是通过专业的相机设备捕捉到的一个空间的高清图像,再经过专业工具进行拼合,呈现出一种环绕式的视觉效果。想象一下,当你站在一个完全真实的环境中,可以自由地转动视角,看到四周的景色&a…

Unreal Engine 4 + miniconda + Python2.7 + Pycharm

1.​首先启用UE4插件里的Python Scripting插件 ​ 2. 在UE4项目设置中 开启Python开发者模式 生成unreal.py文件,用于在Pychram中引入Unreal PythonAPI 生成的unreal.py 在: "项目路径\Intermediate\PythonStub\unreal.py"3. 安装Miniconda…

【Axure高保真原型】3D柱状图_中继器版

今天和大家分享3D柱状图_中继器版的原型模板,图表在中继器表格里填写具体的数据,调整坐标系后,就可以根据表格数据自动生成对应高度的柱状图,鼠标移入时,可以查看对应圆柱体的数据……具体效果可以打开下方原型地址体验…

浅谈云原生

目录 1. 云原生是什么? 2. 云原生四要素 2.1 微服务 2.2 容器化 2.3 DevOps 2.4 持续交付 3. 具体的云原生技术有哪些? 3.1 容器 (Containers) 3.2 微服务 (Microservices) 3.3 服务网格 (Service Meshes) 3.4 不可变基础设施 (Immutable Inf…

c语言练习94:分割链表

分割链表 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1: 输入:head [1,4,3,2,5,2], x…

ABS算法开发与测试(基于ModelBase实现)

ModelBase是经纬恒润开发的车辆仿真软件,包含两个大版本:动力学版本、智能驾驶版本。动力学版包含高精度动力学模型,能很好地复现车辆在实际道路中运行的各种状态变化,可用于乘用车、商用车动力底盘系统算法开发、控制器仿真测试&…

KES服务管理和环境变量配置(Kylin)

KES服务管理命令 root用户systemctl管理 确认KES服务状态 systemctl status kingbase8d.service停止KES服务 systemctl stop kingbase8d.service启动KES服务 systemctl start kingbase8d.service重启KES服务 systemctl restart kingbase8d.servicekingbase用户sys_ctl命令…

git 查看本地秘钥

第一步: 1,打开终端或者命令行窗口,输入一下命令: cd ~/.ssh进入ssh目录 2,查看该目录下的所有文件,输入以下命令: ls -al该命令将显示ssh目录下的所有文件,包括秘钥文件和配置文件,如果不存…

YAPI介绍及Docker Compose部署指南

我们团队的项目最初前后端是同一个开发人员在做,因此并不存在提供详细接口文档等问题。随着项目的不断迭代,团队规模逐渐扩大,我们决定将前后端分开,专门由专业的前端和后端人员进行开发工作。然而,这样的改变也带来了…

亿赛通电子文档安全管理系统 Update.jsp SQL注入

目录 0x01 漏洞介绍 0x02 影响产品 0x03 语法特征 0x04 漏洞复现页面 0x05 漏洞修复建议 0x01 漏洞介绍 亿赛通电子文档安全管理系统是国内最早基于文件过滤驱动技术的文档加解密产品之一,保护范围涵盖终端电脑(Windows、Mac、Linux系统平台&#…

工欲善其事,必先利其器,五款实用的办公软件推荐

​ 你电脑中用的最久的软件是哪些?以下是否有你曾经使用过的软件呢?工欲善其事,必先利其器,今天继续分享五款实用的办公软件。 1.屏幕调节——f.lux ​ f.lux是一款可以根据时间和地点自动调节屏幕亮度和色温的软件,…

一文搞定专属码的设计与开发

作者 | 木白 导读 本文将为您介绍百度码的译码技术,包括关键的译码流程和关键的优化手段。百度码目前已经在高考等活动中进行应用,在未来的发展中,百度码的译码技术将继续升级和完善,以满足更多场景的需求。百度码的译码技术将在现…