纯仓颉手写数字识别
项目简介
本项目实现了一个 基于 BP 神经网络的手写数字识别,使用纯 仓颉(Cangjie)语言完成,并针对矩阵运算进行了优化,利用 spawn {} 协程并行处理,使训练耗时相比串行实现减少约 4 倍。
网络使用 Adam 优化器,一个 epoch 即可基本收敛,适合快速验证和实验。
功能特点
- 纯仓颉实现:无需依赖 Python、TensorFlow、PyTorch 等深度学习框架。
- 协程加速矩阵运算:利用
spawn {}并行计算,实现矩阵乘法、梯度更新等操作加速。 - Adam 优化器:在 BP 网络训练中自适应调整学习率,提高收敛速度。
- 高效训练:在 MNIST 数据集上,一个 epoch 即可达到较高精度。
数据集
-
MNIST 手写数字数据集
- 训练集:
train-images-idx3-ubyte(60,000 张 28x28 灰度图) - 标签:
train-labels-idx1-ubyte - 测试集:
t10k-images-idx3-ubyte(10,000 张 28x28 灰度图) - 标签:
t10k-labels-idx1-ubyte
- 训练集:
数据集下载链接(Yann LeCun 官方): http://yann.lecun.com/exdb/mnist/
网络结构
| 层类型 | 输入大小 | 输出大小 | 激活函数 |
|---|---|---|---|
| 输入层 | 784 | - | - |
| 隐藏层 | 784 | 500 | ReLU |
| 输出层 | 500 | 10 | Softmax |
- 学习率: 0.005
- 正则化系数: 0.01
- Batch Size: 200
- Epochs: 1
性能表现
- 协程优化矩阵运算,使训练耗时下降约 4 倍。
- 一个 epoch 即可基本收敛,测试集准确率可达到 约 90%-92%(与参数和初始化相关)。
文件结构
.
├─ main.cj # 主程序
├─ BPNetwork.cj # BP神经网络实现
├─ Trainer.cj # 训练器实现
├─ MatrixUtils.cj # 矩阵运算工具类实现
├─ MNISTLoader.cj # MNIST 数据加载器
└─ README.md # 项目说明