Background overlay
771 字
4 分钟
08-完整的模型训练
2026-05-06
更新中...

一、 标准训练流程#

1. 数据准备与长度获取#

在开始训练前,需明确数据集规模,以便在日志中计算进度。

# 准备数据集
train_data = torchvision.datasets.CIFAR10(root="../data", train=True, transform=torchvision.transforms.ToTensor(), download=True)
test_data = torchvision.datasets.CIFAR10(root="../data", train=False, transform=torchvision.transforms.ToTensor(), download=True)
# 获取长度:用于后续计算平均 Loss 或准确率
train_data_size = len(train_data)
test_data_size = len(test_data)
print(f"训练集长度:{train_data_size}, 测试集长度:{test_data_size}")
# 加载数据
train_dataloader = DataLoader(train_data, batch_size=64)
test_dataloader = DataLoader(test_data, batch_size=64)

2. 训练配置与日志监控 (TensorBoard)#

使用 SummaryWriter 记录训练曲线是调试模型的必备手段。

# 损失函数与优化器
loss_fn = nn.CrossEntropyLoss()
learning_rate = 1e-2 # 即 0.01
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
# 设置辅助参数
total_train_step = 0 # 记录总训练步数
total_test_step = 0 # 记录测试步数
epoch = 10 # 训练轮数
# 实例化 TensorBoard
writer = SummaryWriter("../logs_train")

二、 核心训练与测试套路#

1. 训练阶段 (Training)#

在每一轮 Epoch 中,通过计数器实现定时日志输出,避免控制台刷新过快。

for i in range(epoch):
print(f"-------第 {i+1} 轮训练开始-------")
model.train()
for data in train_dataloader:
imgs, targets = data
outputs = model(imgs)
loss = loss_fn(outputs, targets)
# 优化器优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_train_step += 1
if total_train_step % 100 == 0:
print(f"训练次数:{total_train_step}, Loss: {loss.item()}")
writer.add_scalar("train_loss", loss.item(), total_train_step)

2. 测试与准确率计算 (Evaluation)#

测试集的表现是评估模型泛化能力的关键。准确率计算逻辑为:(预测正确的样本数) / (总样本数)

model.eval()
total_test_loss = 0
total_accuracy = 0
with torch.no_grad():
for data in test_dataloader:
imgs, targets = data
outputs = model(imgs)
loss = loss_fn(outputs, targets)
total_test_loss += loss.item()
# 计算分类正确的数量
accuracy = (outputs.argmax(1) == targets).sum()
total_accuracy += accuracy
print(f"测试集总 Loss: {total_test_loss}")
print(f"测试集准确率: {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

三、 模型持久化与 GPU 加速#

1. 循环保存策略#

在每一轮 Epoch 结束后保存模型,防止意外中断导致训练成果丢失。

# 方式一:保存整个模型
torch.save(model, f"model_{i}.pth")
print("模型已保存")

2. GPU 硬件加速#

通过 .to(device) 确保所有计算单元位于同一设备。

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
loss_fn = loss_fn.to(device)
# 数据迁移
for data in train_dataloader:
imgs, targets = data
imgs, targets = imgs.to(device), targets.to(device)

四、 工程实践要点总结#

  • 准确率累计total_accuracy 在测试循环中是不断累加张量的 sum(),最后除以 test_data_size 得到百分比。

  • loss.item():记录 Loss 时务必使用 .item(),否则会带上 Tensor 的梯度信息,导致内存/显存持续增长。

  • 张量形状调整:单张图片预测时,需使用 reshape(1, C, H, W) 模拟 Batch 维度,否则 nn.Conv2d 会报错。

  • 关闭 Writer:脚本结束前调用 writer.close(),确保所有缓冲区数据写入磁盘。

五、 开源项目阅读与结构认知#

理解成熟开源项目的结构是进阶开发的关键。通常一个标准的 PyTorch 项目包含以下模块:

  • model.py:定义网络骨架。

  • dataset.py:定义数据加载与预处理逻辑。

  • train.py:主训练脚本,包含参数解析(argparse)。

  • test.py / val.py:模型验证逻辑。

  • config.py:存储超参数(学习率、Batch Size 等)。

08-完整的模型训练
https://icemeow.top/blog/posts/graduate/pytorch-7/
作者
ICEMeow
发布于
2026-05-06
许可协议
CC BY-NC-SA 4.0