Pytorch实战——完整的模型训练套路2

发布于:2025-07-13 ⋅ 阅读:(19) ⋅ 点赞:(0)

验证


加入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 步打印训练信息并记录到 TensorBoard
        if 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))
    # 将测试损失、准确率记录到 TensorBoard
    writer.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

    # 每轮训练结束后保存模型,文件名含当前轮数 i
    torch.save(tudui, "tudui_{}.pth".format(i))
    print("模型已保存")

# 训练结束后关闭 SummaryWriter,释放资源
writer.close()


网站公告

今日签到

点亮在社区的每一天
去签到