MLP手写数字识别
MLP手写数字识别
github项目:https://github.com/xclovehsy/digitalRecANNs
项目简介
构建一个神经网络,利用梯度下降法实现参数的更新,最终实现对0-9的10个手写数字的识别。
其中,MNIST 数据集在 http://yann.lecun.com/exdb/mnist/ 获取, 它包含了四个部分:
- Training set images: train-images-idx3-ubyte.gz (9.9 MB, 解压后 47 MB, 包含 60,000 个样本)
- Training set labels: train-labels-idx1-ubyte.gz (29 KB, 解压后 60 KB, 包含 60,000 个标签)
- Test set images: t10k-images-idx3-ubyte.gz (1.6 MB, 解压后 7.8 MB, 包含 10,000 个样本)
- Test set labels: t10k-labels-idx1-ubyte.gz (5KB, 解压后 10 KB, 包含 10,000 个标签)
算法思路
数据预处理
MNIST手写数字图片集为60000条训练数据以及10000条测试数据。每一条为785个数字。每一条数据的第一个为数字的正确值,接下来的784个为图片的像素点,可以组成一篇28×28的像素的图片。数据预处理为纵向的784个数字矩阵,标签为纵向的10个数字,该每个数值介于0.01到0.99代表了识别为对应数字的概率。
模型架构
这里我采用三层的神经网络模型,即一个输入层、一个隐藏层、一个输出层。
参数说明
- Rate为神经网络模型梯度下降算法的学习率
- epochs为神经网络模型训练的次数
- input_num为神经网络模型的输入层节点数量即784个图片像素
- hide_num为隐藏层节点数量
- output_num为输出层节点数量
- 激活函数选用scipy中的expit函数
函数定义
这里的神经网络模型主要有两个函数,一个训练函数net_train以及一个识别函数net_query。
net_train训练函数通过传入的手写数字图片数据对神经网络模型进行训练,利用梯度下降算法对权重矩阵进行更新。识别函数通过图片数据以及神经网络模型进行计算的到对应数字的识别匹配概率。
load_mnist函数负责加载MNIST数据集中的数据,show_result函数随机获取测试集中的部分数字对神经网络模型的识别结果进行展示。
结果分析
实验结果
当将神经网络训练次数设置为10时,训练测试神经网络模型结果如下,并给出测试集中随机20张手写数值识别结果如下;


结果分析
从实验结果可以看到,神经网络模型的正确识别率很高,在经过60000条数据训练后,识别的成功率高达95%以上。
将模型训练次数设置为1、5、10对神经网络模型进行训练并测试,可以看到当训练次数设置为1时,模型正确识别率为95.57%;当训练次数为5时,模型的正确识别率为97.23%;当训练次数设置为10时,模型的正确识别率为97.23%。
可以发现,模型识别的正确率随着模型训练次数的增加,在一定范围内增加。但是当超过一定的训练次数后,模型的识别正确率不会再增加,这有可能受限于神经网络的层数、隐藏层节点数量,以及手写数字图片的像素精度等因素。