771 字
4 分钟
08-完整的模型训练

一、 标准训练流程
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.01optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
# 设置辅助参数total_train_step = 0 # 记录总训练步数total_test_step = 0 # 记录测试步数epoch = 10 # 训练轮数
# 实例化 TensorBoardwriter = 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 等)。
正在加载评论...
链上评论区