第4步:实战:手写数字识别
在浏览器里真实训练一个神经网络 — 再亲手画个数字考考它
训练仪表 — 每轮结束记录一个点(琥珀 = 训练 Loss·左轴,绿 = 测试准确率·右轴)
Epoch
0
0
训练 Loss
—
—
测试准确率
—
—
混淆矩阵(行 = 真实数字,列 = 预测数字 · 绿 = 认对,红 = 认错 · 每 2 轮刷新)
第一层权重模板 — 32 个神经元各自学到的 8×8「探测器」(蓝 = 正权重·想要笔画,红 = 负权重·想要空白)
手写画板 — 用鼠标 / 手指写一个数字,点「预测」让网络识别
降采样 8×8(网络真正"看到"的输入)
训练几轮后再来考考它
训练控制
数据与画板
训练集 500 张 · 测试集 200 张
输入 8×8 = 64 维 · 网络 64 → 32 → 10
已训练样本 0
输入 8×8 = 64 维 · 网络 64 → 32 → 10
已训练样本 0
这是一个完整的机器学习闭环
① 数据:UCI 手写数字集(8×8 灰度,像素 0-16 归一化到 [0,1]); ② 训练:每个 epoch 先把样本顺序洗牌,再逐样本/小批次反向传播 + Adam 更新 (Batch Size=1 时 Adam 类似自适应 SGD,增大会使梯度更稳定); ③ 评估:每轮在 200 张从没参与训练的测试图上算准确率; ④ 推理:你画的数字被降采样成 8×8,送进同一个网络出结果。
为什么要洗牌?训练集按类别排好序(前 50 张全是 0,接下来全是 1……), 不洗牌的话网络每轮只会"最近学过什么就答什么",前面的类被迅速遗忘(灾难性遗忘)。
混淆矩阵怎么看?对角线(绿)越深越好;红色格子是认错的样本 —— 一眼就能发现网络常把 4 认成 9、3 认成 8 / 9 这类"长得像"的数字。
权重模板 = 第一层 32 个神经元各自的"探测器":蓝色像素是它希望出现笔画的位置, 红色是它希望留白的位置。训练后能看出它们分工盯上了不同的弧线与笔画。
你画的数字为什么有时被认错?训练图只有 8×8 且笔画居中, 字迹的大小、位置、粗细稍有偏差,对网络就是"分布外"输入 —— 真实项目天天面对这个问题。
🔰 先修:ML 第 7 步 · 多分类 + Softmax; 进阶:第 12 步 · 卷积神经网络(图像识别的正解)
① 数据:UCI 手写数字集(8×8 灰度,像素 0-16 归一化到 [0,1]); ② 训练:每个 epoch 先把样本顺序洗牌,再逐样本/小批次反向传播 + Adam 更新 (Batch Size=1 时 Adam 类似自适应 SGD,增大会使梯度更稳定); ③ 评估:每轮在 200 张从没参与训练的测试图上算准确率; ④ 推理:你画的数字被降采样成 8×8,送进同一个网络出结果。
为什么要洗牌?训练集按类别排好序(前 50 张全是 0,接下来全是 1……), 不洗牌的话网络每轮只会"最近学过什么就答什么",前面的类被迅速遗忘(灾难性遗忘)。
混淆矩阵怎么看?对角线(绿)越深越好;红色格子是认错的样本 —— 一眼就能发现网络常把 4 认成 9、3 认成 8 / 9 这类"长得像"的数字。
权重模板 = 第一层 32 个神经元各自的"探测器":蓝色像素是它希望出现笔画的位置, 红色是它希望留白的位置。训练后能看出它们分工盯上了不同的弧线与笔画。
你画的数字为什么有时被认错?训练图只有 8×8 且笔画居中, 字迹的大小、位置、粗细稍有偏差,对网络就是"分布外"输入 —— 真实项目天天面对这个问题。
🔰 先修:ML 第 7 步 · 多分类 + Softmax; 进阶:第 12 步 · 卷积神经网络(图像识别的正解)
💡 键盘快捷键:← → 切换章节