Home/Projects/MNIST CNN
手写数字识别主题插画
PROJECT 06 · 已完成

手写数字识别 · CNN

2026.09●MNIST · 真实训练●纯 PyTorch

机器学习最经典的入门任务:看一张 28×28 的手写数字图,认出它是 0–9 里的哪个。 我用 PyTorch 写了一个小 CNN,在真实 MNIST(6 万训练 / 1 万测试)上端到端训练, 测试集准确率 98.9%。下面都是这次训练真实产出的图和数字。

动手试试:用鼠标写个数字

在下面白板上用鼠标(或手指)写一个 0–9,写完自动识别(抬笔即出结果)。浏览器里跑的就是上面那个训练好的 CNN——权重已导出到本地,不联网、不上传。画得尽量居中、笔画粗一点会更准。

识别结果:–
98.9%测试集准确率
20.7万模型参数量
7万MNIST 图片
6训练 epoch
训练曲线
① 随 epoch 变化:测试准确率升到 ~98.9%,训练损失持续下降。
测试样例预测
② 测试集随机样例,标注"真实→预测"。模型认得各种潦草写法,最容易混的是 8 和 6。
混淆矩阵
③ 混淆矩阵:对角线极亮,错分零散分布在 8/6/5 等相近字形上。

为什么做这个

这是我系统学 PyTorch 之后,第一个从头到尾跑通的视觉模型:数据管道(下载→解析→归一化→DataLoader)、 卷积网络、训练循环、评估与可视化,一整条走了一遍。

也借它理解了卷积为什么适合图像——局部感受野 + 权值共享,参数比全连接少很多,还自带一点平移不变性。 以及 Dropout、学习率、epoch 数这些细节对最终结果的影响。

技术栈

PythonPyTorchNumPyMatplotlibCNNMNIST

代码结构

# mnist-cnn/ data.py # 下载 + 纯 NumPy 解析 MNIST idx 格式 model.py # 两层卷积 + 全连接的小 CNN train.py # 训练 + 评估 + 出图 + 存模型 reports/ # 曲线 / 样例 / 混淆矩阵 / 指标