本项目是一个完全从零实现的手写数字识别系统,基于多层感知器(MLP)架构,使用MNIST数据集进行训练和测试。项目不依赖任何深度学习框架(如TensorFlow、PyTorch、Keras等),而是纯粹使用NumPy从底层实现了神经网络的所有核心组件,包括前向传播、反向传播算法、激活函数、损失函数等。这种从零开始的实现方式有助于深入理解神经网络的工作原理和数学基础。
.
├── MNIST/ # MNIST数据集目录
│ └── mnist.pkl.gz # MNIST数据集压缩文件
├── model/ # 模型保存目录
│ ├── 1/ # 模型子目录
│ └── trained_model.pkl # 训练好的模型
├── result/ # 实验结果目录
│ ├── lr=0.01,epoch=500.png # 不同学习率和训练轮数的实验结果图
│ ├── lr=0.1,epoch=100.png
│ ├── lr=0.01,epoch=200.png
│ ├── lr=0.02,epoch=100.png
│ └── lr=0.03,epoch=100.png
├── graph/ # 激活函数可视化图表
│ ├── 1.png # ReLU激活函数图
│ ├── 2.png # Sigmoid激活函数图
│ └── 3.png # Softmax激活函数图
├── CharacterRecognition.py # 主程序文件
├── canshu.py # 超参数调优程序
├── graph.py # 激活函数可视化程序
└── 实验报告.docx # 实验报告文档
本项目实现了以下核心功能:
- 神经网络架构:多层感知器,包含输入层、多个隐藏层和输出层
- 激活函数:
- ReLU(隐藏层)
- Softmax(输出层)
- Sigmoid(可选)
- 损失函数:交叉熵损失函数
- 优化算法:随机梯度下降(SGD)
- 超参数调优:对隐藏层结构和学习率进行网格搜索
- 模型保存与加载:训练好的模型可保存和加载
- 可视化:损失函数和准确率的训练过程可视化
实现了多种激活函数:
- ReLU:修正线性单元激活函数
- Sigmoid:S型激活函数
- Softmax:用于多分类问题的输出层激活函数
计算激活函数的梯度(导数):
- ReLU的梯度:大于0时为1,否则为0
- Sigmoid的梯度:S(x) * (1 - S(x))
实现了损失函数相关的功能:
- 交叉熵损失函数
- 交叉熵与Softmax的组合梯度计算
- 准确率计算
神经网络的核心实现:
- 初始化网络结构
- 设置激活函数
- 参数初始化
- 数据批量处理
- 前向传播算法
- 反向传播算法
- 梯度清零
- 随机梯度下降优化
- 模型保存和加载
- 训练过程和结果可视化
- Python 3.x
- NumPy(仅用于数值计算,不使用其机器学习功能)
- Matplotlib(仅用于可视化)
- Seaborn (可选,用于图形美化)
注意:本项目不需要安装任何深度学习框架(如PyTorch、TensorFlow等)
项目使用MNIST数据集,数据集已包含在MNIST目录中。
python CharacterRecognition.py这将使用默认参数训练模型,并在测试集上进行验证。
python canshu.py这将对不同的隐藏层配置和学习率进行网格搜索,找出最优的超参数组合。
python graph.py这将生成ReLU、Sigmoid和Softmax激活函数的可视化图表。
通过多次实验和超参数调优,项目在MNIST测试集上达到了较高的准确率。不同配置的实验结果如下:
- 隐藏层结构:[784, 256, 256, 10](输入层784个神经元,两个隐藏层各256个神经元,输出层10个神经元)
- 最佳学习率:0.02
- 训练轮数:200
- 批量大小:16
- 测试集准确率:约97%
- 纯粹从零实现:完全不依赖任何深度学习框架(如PyTorch、TensorFlow、Keras等),仅使用NumPy进行基础数值计算,从底层实现了神经网络的所有组件和算法
- 深入理解原理:通过手动实现前向传播、反向传播、梯度计算等算法,深入理解神经网络的数学原理和工作机制
- 代码注释详细:每个类和方法都有详细的注释,便于理解算法实现细节
- 模块化设计:代码结构清晰,各个功能模块分离
- 超参数调优:提供了超参数调优的功能,可以找出最优的网络配置
- 可视化支持:提供了训练过程和结果的可视化功能
- 实现更多的优化算法,如Adam、RMSprop等
- 添加正则化方法,如L1/L2正则化、Dropout等
- 实现卷积神经网络(CNN),提高识别准确率
- 开发图形用户界面,方便用户使用
- 支持实时手写数字识别功能