先检查数据和张量契约
Dataset 定义取样,DataLoader 组织批次、打乱和加载。输入、标签、模型输出、损失函数各有形状及 dtype 约定。输入与模型要在相容设备上;不能看到报错就随意 reshape,掩盖样本维度错误。
一个训练批次的顺序
| 顺序 | 操作 | 检查 |
|---|---|---|
| 1 | model.train(),加载批次 | 数据划分、batch 维、device/dtype |
| 2 | 前向得到预测 | 输出对应目标,原始 logits 不与概率混用 |
| 3 | 计算 loss | 标签编码、损失输入与归约一致 |
| 4 | optimizer.zero_grad() | 清理上次梯度;主动累积梯度时另有明确计划 |
| 5 | loss.backward() | 参数参与计算图且梯度有效 |
| 6 | optimizer.step() | 参数更新,记录批次/轮次口径 |
| 7 | 验证阶段切 model.eval() | 配合 no_grad/inference_mode,禁用梯度记录 |
eval 调整 dropout、BatchNorm 等模块的行为;no_grad 控制自动微分记录,两者作用不同。验证损失应按一致的样本权重汇总,不把不同大小批次简单平均后混淆口径。
保存什么才能恢复
state_dict 是参数和相关缓冲区。部署还需要结构、预处理、标签映射及版本;恢复训练还需优化器、调度器、步数/轮次和必要的随机状态。保存最佳验证版本时,避免只保留会随训练变化的对象引用。
来源不可信的序列化文件不应直接加载;选择当前官方安全加载方式并核对格式。固定种子也不保证跨硬件与版本逐位相同。
原创检查例子
分类输入为 B×D,输出为 B×C,类别标签为 B。若把 B×C 错当标签 one-hot 却仍使用要求类别索引的损失,就需要检查损失规范,而不是修改模型直到报错消失。
练习与完成标准
在纸上给上述七步标注形状和梯度状态,设计一个小批次过拟合检查与保存/重载前后同输入预测对照。实际运行时记录 Python、PyTorch、设备、数据哈希和日志。本篇是概念与操作清单,未训练,不标记为实验。
复习问题
- eval 和 no_grad 可以互相替代吗?
- 只保存权重为什么不能完整恢复训练?
- 小批次也无法拟合时,先查什么?
阅读依据与核验范围
- beginner_source/basics/data_tutorial.py
- beginner_source/basics/optimization_tutorial.py
- beginner_source/basics/saveloadrun_tutorial.py
2026-10-07:AI 助手协助原创整理并核对原始章节。示例、手算和练习由本站设计;未执行的任务不作为实验结论。
原始资料与核验依据
- PyTorch 官方教程:训练循环与迁移学习PyTorch 贡献者 · main 快照 c80a43460c83 · 访问于 2026-10-07
继续探索
哪些笔记引用了这里
学习路径:模型训练与对齐:从梯度到微调评估
第 3 / 8 步 · 验证任务:检查形状、模式、梯度状态和保存/恢复清单。
学习路径:AI 系统学习主线:从基础到应用
第 9 / 21 步 · 验证任务:标注训练循环的形状与梯度状态,列保存和重载清单。