主题
手写数字识别:MNIST 在线演示
手写数字识别是深度学习的 “Hello World”。本页有两个演示:先用一个已经训练好的网络识别你写的数字,再在浏览器里从零训练一个自己的小网络。两个演示都只用纯 JavaScript 计算,模型和数据从本站下载,不会上传你画的内容。
一、写一个数字让网络识别
模型说明:784-256-128-10 的前馈网络(ReLU 激活、Softmax 输出),在 MNIST 的 6 万张训练图上训练,训练时加入了随机旋转、缩放、平移和笔画粗细变化,让它对手写输入更稳健;权重用 8 位整数量化后只有约 230 KB,在 1 万张测试图上的准确率为 98.8%。对应教材第 4 章 前馈神经网络。
可以试试:
- 把数字写歪、写得很细或只写一半,看看置信度怎么变化。
- 写一个“不是数字”的符号(比如字母 A),网络仍然会自信地给出某个数字——Softmax 输出的概率并不等于“可信程度”。
- 观察隐藏层:不同数字会点亮不同的神经元组合,这就是网络学到的表示。
二、在浏览器里训练自己的网络
数据是从 MNIST 中随机抽取的 5000 张训练图和 1000 张测试图,缩小到 14×14 像素(约 1.2 MB),这样在手机上也能几秒钟训练完。训练好的模型会自动出现在上面的画板里,和预训练模型对比。
可以试试:
- 隐藏层设为 0:网络退化为 Softmax 回归(线性分类器),测试准确率约 90%;加一个 64 个神经元的隐藏层,同样 8 轮通常能到 93%–94%。
- 训练样本只用 200 张、训练 20 轮:训练集准确率接近 100%,测试集只有 80% 左右——这就是过拟合。把样本加到 5000 张,差距会明显缩小;只加 L2 正则的效果则有限,说明“更多数据”往往是最有效的正则化。
- SGD vs Adam:SGD 需要更大的学习率(0.03–0.1),Adam 用 0.001–0.003 就很好;学习率太大时损失会发散。对照优化器演示。
- 看混淆矩阵:最常见的错误是 4↔9、3↔5、7↔9 这些形状相近的数字。
数据与许可
MNIST 数据集由 Yann LeCun、Corinna Cortes 和 Christopher J.C. Burges 整理,按 CC BY-SA 3.0 许可使用。本页的预训练模型和 14×14 子集由本站用 MNIST 训练集和测试集生成。
相关内容
- 第 4 章 前馈神经网络 · 第 5 章 卷积神经网络
- 前馈网络训练场 · 反向传播逐步演示 · Softmax 与交叉熵