← 全部项目

进行中 / 2026.10 开始

用 NumPy 从零实现手写数字识别

不用 PyTorch。先把前向传播、损失、反向传播各手写一遍,再对照框架确认自己没写错。

角色
独立完成
技术栈
Python · NumPy
开始
2026.10

要解决什么

用框架三行就能跑通 MNIST,但我不确定自己真的知道梯度是从哪来的。所以这个项目的目标不是「识别率多高」,而是「每一行代码我都能解释」。

怎么做

  • 数据:MNIST 拉平成 784 维,归一化到 0–1。
  • 网络:784 → 128(ReLU)→ 10,softmax + 交叉熵。
  • 反向传播:先手推一遍,再用 NumPy 实现,然后跟数值梯度比对。
  • 验证:最后用 PyTorch 写同一套结构,看两边参数更新是否一致。

现在的进度

前向传播和损失函数写完了。反向传播卡在 softmax 这一层——手推的结果和数值梯度差 10⁻² 量级,说明某处推导写错了,不是精度问题。

待解决

  • 把 softmax + 交叉熵的梯度合并推导(合并之后形式会简单很多,也就更不容易错)。
  • 加 mini-batch 和动量。
  • 写个把权重矩阵可视化成图片的小工具,看看它到底学到了什么。