首页 › S 模型训练 › S1 基础概念与第一个实验 › 01

01 · 第一个训练实验:MNIST 手写数字识别

入门阶段约 240 分钟阶段:S1 基础概念与第一个实验

阶段:S1-基础概念与第一个实验(完整 9 阶段路线见 ../README.md)| 日期:2026-11-10 | 环境:你的笔记本(i7-8550U / 16GB / 无 GPU,纯 CPU 训练) 代码:E:\zcode\DeepTraining\model-learn\01_mnist_cnn.py 为什么选它:数据集只有 11MB、模型只有约 10 万参数、你的 CPU 上几分钟出结果——体量足够小到"一次就能看完训练全程",又完整覆盖了深度学习训练的全部核心概念。学会它 = 掌握训练的骨架,之后换任何数据集/模型都是填充细节。


一、这个实验能让你"掌握"什么

学完并做完改动实验后,你应该能回答:

  1. 训练五步闭环是什么?(清梯度→前向→算损失→反向→更新)
  2. loss 是什么?它为什么会自己下降?
  3. epoch / batch / 梯度 分别对应什么现实动作?
  4. 准确率和 loss 有什么关系?为什么 loss 降了准确率未必升?
  5. 模型怎么保存与复用?

二、运行方式(三档)

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 万道稳定)。

四、数据与模型的三个工程细节(都是你机器相关的最佳实践)

  1. 数据保持 uint8 落盘,DataLoader 里才转 float32——transforms.ToTensor() 只在读取时转换。这正是训练数据集.md里"图像落盘保持 JPEG/uint8 省 75-90%"原则的实践版
  2. torch.set_num_threads(4)——你的 CPU 只有 4 物理核,线程超了反而互相争抢变慢
  3. 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/私有化部署)的知识底座。

小测验(3 题)

答完立即判分,错题给解析;得分存本地。实验与实操题不上网测:回对话找老师验收。