阶段:S4-训练过程 | 预计耗时:75-90 分钟(三种病各跑一次)| 前置:S3 全部验收通过 新依赖:
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple代码:本篇代码要你自己敲成model-learn/s4_loss_curves.py
学习目标
- 学会记录训练曲线:每个 epoch 的 train loss / val loss 双线
- 亲手制造三种病——欠拟合、过拟合、震荡——各跑一次,把图存档
- 达到"给你一张曲线图,30 秒说出它得了什么病、该开什么药"的水平
核心知识
1. 三种病的曲线指纹
| 病 | 曲线长相 | 病因 | 药方 |
|---|---|---|---|
| 欠拟合 | train 高且不再降 | 模型太小/轮数太少 | 加大模型/多训/加特征 |
| 过拟合 | train 持续降,val 先降后升(剪刀差) | 模型背题了 | 更多数据/增强/正则化/早停 |
| 震荡(lr 太大) | 上下乱跳甚至 NaN | 步子太大 | 减小学习率 |
2. 为什么必须画 val 线
只看 train loss 永远觉得"一切正常"——过拟合的信号只出现在 val 线上。S2-02 的划分知识在这里兑现。
3. 本机实现要点
- 每 epoch 结束评一次 val(5000 样本几秒钟,开销可忽略)
- 结果存 CSV + matplotlib 画 PNG 存档(放进本阶段文件夹)
- 三种配置用命令行参数切,一次只跑一种
实验任务
任务 1:写带记录的训练脚本(40 分钟)
核心骨架(在 S1-01 训练循环上加两件事:每 epoch 记录 + 最后画图):
# s4_loss_curves.py --config normal|overfit|chaos
# normal : 5000样本 5epoch lr=1e-3 (健康对照)
# overfit: 200样本 30epoch lr=1e-3 (背题现场)
# chaos : 5000样本 5epoch lr=5 (步子太大)
# 每 epoch 记录 train_loss / val_loss 到列表,最后:
import matplotlib
matplotlib.use("Agg") # 无窗口环境也能出图
import matplotlib.pyplot as plt
plt.plot(train_hist, label="train"); plt.plot(val_hist, label="val")
plt.legend(); plt.title(config); plt.savefig(f"loss_{config}.png", dpi=120)
(CSV 也存一份:epoch,train_loss,val_loss——数据比图更值得留档。)
任务 2:跑三种配置,存三张图(20 分钟)
.venv/Scripts/python.exe s4_loss_curves.py --config normal
.venv/Scripts/python.exe s4_loss_curves.py --config overfit
.venv/Scripts/python.exe s4_loss_curves.py --config chaos
任务 3:自我考核(15 分钟)
把三张 PNG 打乱顺序重看,每张 30 秒内说出:什么病 → 证据(哪条线什么形态)→ 开什么药。答案写进观察记录表。
验收标准
衔接下一阶段
会诊病 → S4-02 过拟合与正则化:把"过拟合"这张图当靶子,逐一试药。