Pytorch实战——完整的模型训练套路2
验证
加入Tensorboard
验证
创建dataset,dataloader加载数据,设置模型的层数,定义损失函数,定义优化器,设置网络参数,开始训练,验证模型,可视化结果
# 导入所需库
import torchvision
from torch.utils.tensorboard import SummaryWriter
# 从自定义 model 模块导入所有内容(需确保 model.py 定义了 Tudui 类)
from model import *
from torch import nn
from torch.utils.data import DataLoader# 准备 CIFAR10 训练数据集
# root 为数据集保存路径,train=True 表示训练集,ToTensor 转换为张量,download=True 自动下载
train_data = torchvision.datasets.CIFAR10(root="../data", train=True, transform=torchvision.transforms.ToTensor(),download=True)
# 准备 CIFAR10 测试数据集,train=False 表示测试集,其余参数含义同训练集
test_data = torchvision.datasets.CIFAR10(root="../data", train=False, transform=torchvision.transforms.ToTensor(),download=True)# 获取训练、测试数据集的样本数量
train_data_size = len(train_data)
test_data_size = len(test_data)
# 打印数据集长度信息
print("训练数据集的长度为: {}".format(train_data_size))
print("测试数据集的长度为: {}".format(test_data_size))# 利用 DataLoader 按批次加载数据集,batch_size=64 表示每批 64 个样本
train_dataloader = DataLoader(train_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)# 创建自定义的 Tudui 神经网络模型实例
tudui = Tudui()# 定义损失函数,使用交叉熵损失,适用于分类任务
loss_fn = nn.CrossEntropyLoss()# 定义优化器,使用随机梯度下降(SGD),学习率设为 1e-2(即 0.01 ),优化模型参数
learning_rate = 1e-2
optimizer = torch.optim.SGD(tudui.parameters(), lr=learning_rate)# 训练过程参数初始化
total_train_step = 0 # 记录训练步数
total_test_step = 0 # 记录测试步数
epoch = 10 # 训练的轮数# 创建 SummaryWriter,用于在 TensorBoard 中记录日志,日志保存路径为 ../logs_train
writer = SummaryWriter("../logs_train")# 开始训练循环,执行 epoch 轮训练
for i in range(epoch):print("-------第 {} 轮训练开始-------".format(i + 1))# 训练步骤:将模型设为训练模式(会启用 dropout、批量归一化的训练行为等)tudui.train()for data in train_dataloader:imgs, targets = data # 从数据加载器中取出一批图像和对应的标签outputs = tudui(imgs) # 将图像输入模型,得到预测输出loss = loss_fn(outputs, targets) # 计算预测输出与真实标签的损失# 优化器更新模型参数的流程optimizer.zero_grad() # 清空过往梯度loss.backward() # 反向传播计算梯度optimizer.step() # 根据梯度更新模型参数total_train_step += 1 # 训练步数加 1# 每 100 步打印训练信息并记录到 TensorBoardif total_train_step % 100 == 0:print("训练次数: {}, Loss: {}".format(total_train_step, loss.item()))writer.add_scalar("train_loss", loss.item(), total_train_step)# 测试步骤:将模型设为评估模式(会关闭 dropout、批量归一化的训练行为等,使用推理模式)tudui.eval()total_test_loss = 0 # 记录测试集总损失total_accuracy = 0 # 记录测试集总准确率# 测试时不需要计算梯度,加快速度并节省内存with torch.no_grad():for data in test_dataloader:imgs, targets = data # 取出一批测试图像和标签outputs = tudui(imgs) # 模型预测loss = loss_fn(outputs, targets) # 计算损失total_test_loss += loss.item() # 累加测试损失# 计算该批样本的准确率:预测类别与真实类别匹配的数量accuracy = (outputs.argmax(1) == targets).sum()total_accuracy += accuracy # 累加正确数量# 打印测试集整体损失和准确率print("整体测试集上的 Loss: {}".format(total_test_loss))print("整体测试集上的正确率: {}".format(total_accuracy / test_data_size))# 将测试损失、准确率记录到 TensorBoardwriter.add_scalar("test_loss", total_test_loss, total_test_step)writer.add_scalar("test_accuracy", total_accuracy / test_data_size, total_test_step)total_test_step += 1 # 测试步数加 1# 每轮训练结束后保存模型,文件名含当前轮数 itorch.save(tudui, "tudui_{}.pth".format(i))print("模型已保存")# 训练结束后关闭 SummaryWriter,释放资源
writer.close()