这是整套教程的第一章。目标只有一个: 用最少的代码跑通一次完整的 CIFAR-10 图像分类训练与验证 。本章假设你只了解深度学习的基本概念(知道"神经网络能学图像特征"就够),代码里出现的每个概念都会用通俗的语言解释一遍。本章刻意不做任何工程化(没有 argparse、没有 logging、没有 checkpoint),为的是让你先看清训练流程的"骨架"长什么样。
第 1 章我们用最少的代码跑通了 CIFAR-10 的训练流程,但留下两个隐患:
所谓"验证集"其实用的是官方 测试集 ,每个 epoch 都对它算指标,等于高考前先把真题答案看了几遍;
指标打印完就丢,无法复盘"模型到底怎么一步步变好的"。
本章就解决这两件事:把数据切成 训练 / 验证 / 测试 三段,各司其职;再用一个简单的
defaultdict把每个 epoch 的指标记录下来,为后面画曲线、做可视化、调参打基础。
第 2 章结束时,
EPOCHS、BATCH_SIZE、lr、num_workers、root="./data"还硬编码在源码里,每调一次超参数就要改代码、改了什么无从追溯;同时训练循环像"黑盒",几百个 batch 静悄悄地跑,看不到任何进度。本章解决这两个问题:用标准库
argparse把所有超参数变成命令行参数,用社区库tqdm在终端显示 batch 级实时进度条。
第 3 章把学习率从硬编码解放成了命令行参数
--lr,但整个训练过程它始终是一个固定值。本章解决这个问题:引入torch.optim.lr_scheduler(学习率调度器),让学习率随训练进度动态变化——前期大步快跑,训练后期小步精调。
第 4 章结束时,我们学会了用 lr_scheduler 让学习率随训练动态变化,但训练产生的所有成果都还只存在于内存里:进程一退出,几小时(甚至几十小时)的进度就灰飞烟灭。本章引入 checkpoint(检查点/存档),把"训练现场"完整保存到磁盘——训练中断可以无缝续跑,训练结束后还能取出验证集最优的那个模型。
第 5 章我们学会了把"训练现场"完整存进 checkpoint,还能用 best.pth 留住验证集表现最好的那个模型。但训练本身仍然"闷头跑满 --epochs 指定的全部轮数":如果模型第 20 轮就到顶了,剩下 30 轮既浪费时间,还可能让模型在训练集上继续"死记硬背"。本章加一个早停机制(Early Stopping):验证集指标连续 N 轮不再提升,训练就自动提前收工—— 由机器来喊停,而不是人肉盯日志按 Ctrl+C 。
第 6 章我们有了早停,模型能"见好就收"了,但所有信息仍然靠
logging建一个"广播台"(分级、带时间戳、同时写控制台和文件),用 TensorBoard 在浏览器里看训练仪表盘,再引入社区库rich把终端输出从"黑白打字机"变成"彩色显示器"。
第 7 章把日志(logging + TensorBoard)收拾利落,但命令行参数堆到了十几个:
--epochs --batch-size --lr --lr-scheduler --data-dir --num-workers --device --ckpt-dir --patience --log-dir ...,一行命令又长又难对比,换个数据集就得重拼一遍,也没法把"一组实验配置"当文件存档。本章引入 YAML 配置文件:把不常变的超参数按模块写进config/config.yaml,命令行只保留--config / --lr / --epochs / --batch-size / --resume五个常用覆盖项——"一份写好的菜单 + 临时口头加两笔菜"的组合。
第 8 章结束时我们撞上了一面墙:训练集 acc 已经冲到 99%,验证集却只有 72%——模型把训练集"背"下来了。本章引入数据增强:训练时给每张图生成大量"变体",逼模型去学"通用的规律"而不是"特定的像素"。同时把增强做成
data.augmentation配置段,让"关增强 / 开增强"从改代码变成改一行 YAML。
第 9 章用数据增强解决了"模型记不住"的问题,但训练还有另一道更硬的坎:显存不够、训练太慢。模型一大、batch 一大,FP32 的权重、激活、梯度瞬间撑爆显存,
CUDA out of memory随手就来;而现代 GPU 对 FP16 有专门的"张量核心",算同一份数据的速度接近翻倍。本章用 PyTorch 自带的自动混合精度(AMP),不改一行模型结构,就同时拿到"省显存 + 提速"。
