当前位置: 首页 > 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}%')

相关文章:

  • 【笔记】OpenCV的学习(未完)
  • 开发者工具箱-鸿蒙颜色转换器开发笔记
  • React Native 拼音及拼音首字母搜索组件开发
  • LLM Tuning
  • OpenLayers 开发环境搭建
  • 每日c/c++题 备战蓝桥杯(洛谷P3382 三分法求极值详解)
  • 模型参数详细介绍--Profiler
  • Python如何赋能自动驾驶地图构建?从点云处理到实时导航
  • Redis持久化机制:AOF与RDB深度解析
  • 电机控制储备知识学习(五) 三项直流无刷电机(BLDC)学习(四)
  • NetSuite Emoji的应用
  • JavaScript 文件类型识别与状态图片返回系统
  • [AI]主流大模型、ChatGPTDeepseek、国内免费大模型API服务推荐(支持LangChain.js集成)
  • 开发者工具箱-鸿蒙DNS查询工具开发笔记
  • vue3 发票税率 计算
  • 汉字不仅是一种语言 还是当作艺术形式来展现
  • Python 基础语法速查手册:从入门到精通
  • 怎么开发一个网络协议模块(C语言框架)之(四) 信号量初始化
  • STM32上配置图像处理库时常见错误总结
  • 人脸美颜磨皮祛痘1:数据集说明(含下载链接)
  • php做网站最容易/google seo是什么意思
  • 旅游小镇网站建设方案/友链交易平台
  • 常州企业建站系统模板/搜索引擎优化关键词选择的方法有哪些
  • 网页制作三剑客软件/苏州网站优化公司
  • 工作室 网站/百度极速版下载安装
  • 嵊州市住房和城乡建设局网站/站长工具查询seo