当前位置: 首页 > news >正文

6-6 卷积神经网络LeNet

1.LeNet

import torch
from torch import nn
from d2l import torch as d2lnet = 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)
)
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])

2.模型训练

batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size=batch_size)
def evaluate_accuracy_gpu(net, data_iter, device=None):'''使用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]
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(1*X.shape[0], d2l.accuracy(y_hat, y), X.shape[0])metric.add(l.sum().item(), d2l.accuracy(y_hat, y), X.shape[0])timer.stop()train_1 = 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_1, train_acc, None))test_acc = evaluate_accuracy_gpu(net, test_iter)animator.add(epoch+1, (None, None, test_acc))print(f'loss {train_1:.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)}')
lr, num_epochs = 0.9, 10
train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())
loss 0.002, train acc 0.827,test acc 0.803
9020.8 examples/secon cpu

image


http://www.gsyq.cn/news/9276.html

相关文章:

  • 20250921 之所思 - 人生如梦
  • 通过微信对客服系统客户进行消息提醒,比如客户快过期了,访客发来的消息也是通过模板消息通知给客服
  • 软件工程第二次作业——个人项目
  • fedora无法看视频?编解码器详细安装教程【转发】
  • Salephpscripts Web_Directory_Free SQL注入漏洞利用分析(CVE-2024-3552)
  • 12306高并发架构设计:基于区间计数器的网关层拒单方案
  • 【C++】第十三节—stack、queue、priority_queue、容器适配器(介绍和使用+模拟搭建+OJ题)
  • 20231427田泽航第二周预习报告
  • (多线程)线程安全和线程不安全 产生的原因 synchronized关键字 synchronized可重入特性死锁 如何避免死锁 内存可见性 - 详解
  • 刷新记录:TapData Oracle 日志同步性能达 80K TPS,重塑实时同步新标准 - 指南
  • 详细介绍:算法题(203):矩阵最小路径和
  • JAVA中ArrayList主要语法(小白)
  • 使用jdbcTemplate查询数据库
  • STM32 单片机创建 - I2C 总线
  • 线性结构之链表预备知识typedef[基于郝斌课程]
  • Excel滚动表格表头不见了,来回翻动很麻烦,Excel如何固定显示表头?
  • gdu 手机清理 空间占用
  • Android 源码解析 之 MediaPlayer
  • STM32初始化串口重定向后printf调试信息不输出的难题
  • 5. 二叉树
  • fastapi-langgraph
  • 第二周预习作业
  • AOSP Android12 Source 下载同步
  • 02020404 EF Core基础04-自增主键、Guid主键、混合自增、Hi/Lo算法、Migration深入、数据库其它迁移命令
  • Java中异步任务的执行方式有几种?
  • python爬虫测试
  • [硬件电路-232]:FET(场效应管)的核心机制是通过栅极电压调控半导体“沟道“中的载流子浓度与分布,进而控制源极与漏极之间的电流大小 - 指南
  • 【C++实战⑬】解锁C++文件操作:从基础到实战的进阶之路 - 实践
  • logicFlow________文档2
  • 软件工程第二次作业-第一次个人编程作业