阶段:S1-基础概念与第一个实验(完整 9 阶段路线见 ../README.md)| 日期:2026-11-10 | 环境:你的笔记本(i7-8550U / 16GB / 无 GPU,纯 CPU 训练) 代码:
E:\zcode\DeepTraining\model-learn\01_mnist_cnn.py为什么选它:数据集只有 11MB、模型只有约 10 万参数、你的 CPU 上几分钟出结果——体量足够小到"一次就能看完训练全程",又完整覆盖了深度学习训练的全部核心概念。学会它 = 掌握训练的骨架,之后换任何数据集/模型都是填充细节。
一、这个实验能让你"掌握"什么
学完并做完改动实验后,你应该能回答:
- 训练五步闭环是什么?(清梯度→前向→算损失→反向→更新)
- loss 是什么?它为什么会自己下降?
- epoch / batch / 梯度 分别对应什么现实动作?
- 准确率和 loss 有什么关系?为什么 loss 降了准确率未必升?
- 模型怎么保存与复用?
二、运行方式(三档)
cd /e/zcode/DeepTraining/model-learn
# 冒烟测试:500 样本 × 1 epoch,约 1 分钟,验证全流程
.venv/Scripts/python.exe 01_mnist_cnn.py --smoke
# 完整训练:60000 样本 × 2 epoch,实测约 90 秒(首刷含 MNIST 下载会更久)
.venv/Scripts/python.exe 01_mnist_cnn.py
# 加长:看 loss 下降曲线和准确率天花板
.venv/Scripts/python.exe 01_mnist_cnn.py --epochs 5
实测基线(2026-11-10 你的机器): - 冒烟(500 样本 × 1 epoch):8.0 秒(含下载与启动开销),loss 2.2579,准确率 40.7%——loss 起点约 2.3(= ln10,10 类随机瞎猜水平),500 样本只够它"动了一点点" - 全量(60000 样本 × 2 epoch):epoch1 loss=0.2313(45.8s)→ epoch2 loss=0.0629(44.6s),测试集准确率 98.61%,总计约 90 秒 - 两相对比的教材价值:同样的模型,唯一变量是数据量与训练时长——40.7% vs 98.61%,这就是"什么叫训练充分" - 注意:冒烟的 8 秒几乎全是下载+启动开销,真实训练速度约 0.05 秒/批——所以别用冒烟耗时外推全量耗时(我就犯过这个错)
三、训练五步闭环(代码 × 概念对照表)
训练循环里最重要的 4 行,逐行对应一个现实动作:
| 代码 | 概念 | 现实类比 |
|---|---|---|
opt.zero_grad() |
清梯度 | 擦掉黑板上的旧笔记 |
loss = loss_fn(model(x), y) |
前向传播 + 算损失 | 学生做一道题,对照答案看错多少 |
loss.backward() |
反向传播 | 找出"每个知识点(参数)差在哪、差多少" |
opt.step() |
参数更新 | 针对薄弱点微调学习方法 |
epoch = 把 6 万道题全部做完一轮;batch = 每次做 64 道题再统一批改(比一题一改快,比一次改 6 万道稳定)。
四、数据与模型的三个工程细节(都是你机器相关的最佳实践)
- 数据保持 uint8 落盘,DataLoader 里才转 float32——
transforms.ToTensor()只在读取时转换。这正是训练数据集.md里"图像落盘保持 JPEG/uint8 省 75-90%"原则的实践版 torch.set_num_threads(4)——你的 CPU 只有 4 物理核,线程超了反而互相争抢变慢num_workers=0——Windows 下多进程 DataLoader 容易报错且本机 CPU 不强,0 最稳
五、改动实验(本实验的真正学习部分,至少做前 3 个)
| # | 改动 | 预期现象 | 你会学到 |
|---|---|---|---|
| 1 | --epochs 5 vs --epochs 2 |
准确率提升但增幅递减 | 收益递减/过拟合雏形 |
| 2 | lr=1e-3 改成 lr=1,再改 lr=1e-7 |
太大→loss 震荡不收敛;太小→loss 几乎不动 | 学习率是训练第一超参数 |
| 3 | 冒烟模式:500 样本 vs 5000 样本 | 数据越多准确率越高 | 数据量 vs 模型能力 |
| 4 | 删掉第一个 Conv2d(只留 Linear) |
准确率明显下降 | 卷积层为什么有用(空间特征) |
| 5 | torch.manual_seed 改成 7、123 |
每次结果略有不同 | 随机性、可复现性 |
| 6 | batch_size=64 改 1024 | 单步变快、总轮数变少、收敛变糙 | batch 大小的权衡 |
实验纪律:每次只改一个变量,记录结果到本文件夹新笔记(如
02-学习率实验-loss不收敛怎么办.md)。
六、常见报错速查
| 报错 | 原因 | 解法 |
|---|---|---|
Connection timed out 下载 MNIST |
官方源在国内不稳 | 手动下载 4 个 .gz 放 model-learn\data\MNIST\raw\(见训练数据集.md镜像地址) |
KeyError / torch 相关 import 失败 |
用错解释器 | 必须用 .venv/Scripts/python.exe(见 LangGraph 归档 01 篇) |
| 内存爆 / 卡死 | 同时跑了别的大程序 | 关浏览器再试;16GB 跑这个实验绰绰有余 |
| 速度远慢于预期 | 线程没设/后台占核 | 确认 torch.set_num_threads(4);任务管理器查占用 |
七、毕业标准与下一步
毕业标准:完成改动实验 1-3,并能向别人讲清楚"loss 从 2.3 降到 0.05 的过程中,参数到底发生了什么"。
下一步路径(完整 9 阶段路线见 README,下面 4 步对应 S3/S2/S8/S8): 1. 02 篇(预告):把 MNIST 模型加载回来做推理——理解"训练"和"部署"的分界 2. CIFAR-10 彩色图分类(170MB,难度↑,学数据增强) 3. 表格数据 LightGBM(秒级训练,衔接金融量化路线) 4. 0.5B 小模型 LoRA 微调(把"训练"升级到 LLM 时代,对应训练数据集.md 第 3 名路线)
八、与本机其他学习的关系
LangGraph(调用模型) ←→ 本实验(造模型) ←→ llama.cpp(推理模型)
编排层 训练层 推理层
三者合起来 = 完整理解"模型从哪来、怎么用、怎么部署"——正是长期价值评估里 Top3 技能(Agent/RAG/私有化部署)的知识底座。