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

Python训练营---Day35

知识点回顾:
  1. 三种不同的模型可视化方法:推荐torchinfo打印summary+权重分布可视化
  2. 进度条功能:手动和自动写法,让打印结果更加美观
  3. 推理的写法:评估模式

作业:调整模型定义时的超参数,对比下效果。

调整参数,构建三层神经网络,修改学习率为0.001

import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from tqdm import tqdm
import time
from torchsummary import summary
import matplotlib.pyplot as plt# 设置GPU设备
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(f"使用设备: {device}")# 加载鸢尾花数据集
iris = load_iris()
X = iris.data  # 特征数据
y = iris.target  # 标签数据# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 归一化数据
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)# 将数据转换为PyTorch张量并移至GPU
X_train = torch.FloatTensor(X_train).to(device)
y_train = torch.LongTensor(y_train).to(device)
X_test = torch.FloatTensor(X_test).to(device)
y_test = torch.LongTensor(y_test).to(device)class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()# 第一层:输入层到第一个隐藏层self.fc1 = nn.Linear(4, 16)  # 增加了神经元数量# 第二层:第一个隐藏层到第二个隐藏层self.fc2 = nn.Linear(16, 8)  # 神经元数量递减(金字塔结构)# 激活函数self.relu = nn.ReLU()# 第三层:第二个隐藏层到输出层self.fc3 = nn.Linear(8, 3)   # 输出3个类别def forward(self, x):# 前向传播路径out = self.fc1(x)out = self.relu(out)out = self.fc2(out)out = self.relu(out)out = self.fc3(out)return out# 实例化模型并移至GPU
model = MLP().to(device)# 打印模型摘要,可以放置在模型定义后面
summary(model, input_size=(4,))# 分类问题使用交叉熵损失函数
criterion = nn.CrossEntropyLoss()# 使用随机梯度下降优化器
optimizer = optim.SGD(model.parameters(), lr=0.001)# 训练模型
num_epochs = 20000  # 训练的轮数# 用于存储每100个epoch的损失值和对应的epoch数
losses = []
epochs = []start_time = time.time()  # 记录开始时间# 创建tqdm进度条
with tqdm(total=num_epochs, desc="训练进度", unit="epoch") as pbar:# 训练模型for epoch in range(num_epochs):# 前向传播outputs = model(X_train)  # 隐式调用forward函数loss = criterion(outputs, y_train)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()# 记录损失值并更新进度条if (epoch + 1) % 200 == 0:losses.append(loss.item())epochs.append(epoch + 1)# 更新进度条的描述信息pbar.set_postfix({'Loss': f'{loss.item():.4f}'})# 每1000个epoch更新一次进度条if (epoch + 1) % 1000 == 0:# print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')pbar.update(1000)  # 更新进度条# 确保进度条达到100%if pbar.n < num_epochs:pbar.update(num_epochs - pbar.n)  # 计算剩余的进度并更新time_all = time.time() - start_time  # 计算训练时间
print(f'Training time: {time_all:.2f} seconds')# # 可视化损失曲线
# plt.plot(range(len(losses)), losses)
# plt.xlabel('Epoch')
# plt.ylabel('Loss')
# plt.title('Training Loss over Epochs')
# plt.show()# 评估模型
model.eval()
with torch.no_grad():outputs=model(X_test)_,predicted=torch.max(outputs,1) #1 表示在第 1 个维度(通常是行方向)上寻找最大值。#这个函数返回2个值,分别是最大值和对应索引,参数1是在第1维度(行)上找最大值,_ 是Python的约定,表示忽略这个返回值,所以这个写法是找到每一行最大值的下标# 此时outputs是一个tensor,p每一行是一个样本,每一行有3个值,分别是属于3个类别的概率,取最大值的下标就是预测的类别# predicted == y_test判断预测值和真实值是否相等,返回一个tensor,1表示相等,0表示不等,然后求和,再除以y_test.size(0)得到准确率# 因为这个时候数据是tensor,所以需要用item()方法将tensor转化为Python的标量# 之所以不用sklearn的accuracy_score函数,是因为这个函数是在CPU上运行的,需要将数据转移到CPU上,这样会慢一些# size(0)获取第0维的长度,即样本数量correct=(predicted==y_test).sum().item() #计算预测正确的样本数accuracy=correct/y_test.size(0) #计算准确率print(f'测试集准确率:{accuracy*100:.2f}%')

http://www.xdnf.cn/news/628651.html

相关文章:

  • 哈希表原理与双散列实战指南
  • 超时处理机制设计:从TICK到回调
  • 刷leetcode hot100返航版--贪心5/23
  • Python性能优化利器:__slots__的深度解析与避坑指南
  • 《2.1.4 C语言中的整数类型及类型转换|精讲篇》
  • 基于netmiko模块实现支持SSH or Telnet的多线程多厂商网络设备自动化巡检脚本
  • 测试总结(一)
  • 虚拟文件(VFS)
  • RK3588 DRM 介绍及调试记录
  • keycloak获取用户信息(go实现获取keycloak用户信息)
  • 打卡35天
  • IEC 60034-30-1标准解析:旋转电机能效分级与全球影响
  • 树形DP
  • HarmonyOS介绍
  • 【深度剖析】三一重工的数字化转型(下篇1)
  • Stream流的中间方法、终结方法与收集方法
  • 【日志软件】hoo wintail 的替代
  • Python——MySQL远程控制
  • [原创]X86C++反汇编01.IDA和提取签名
  • 1、初识YOLO:目标检测的闪电战
  • 地下综合管廊 3D 可视化平台
  • CSS定位详解:掌握布局的核心技术
  • C语言数据结构-链式栈
  • 为什么尺规无法三等分任意角?
  • Eclipse中设置Java程序运行时的JVM参数
  • 聊一聊手动测试与探索性测试的区别
  • 嵌入式培训之系统编程(四)进程
  • 试验台铁地板:颠覆传统的创新之举
  • 【RocketMQ 生产者和消费者】- 生产者启动源码 - MQClientInstance 定时任务(4)
  • ✨ PLSQL卡顿优化