MNIST数字识别是机器学习项目的经典案例,在Kaggle上也有此项比赛,本文中的代码是使用TensorFlow与Keras实现的。
我已将代码放到了我的Github上,有兴趣的朋友可以看一下。
目前更新了四个版本,下面简要介绍一下每个版本的主要内容。
v0.1版本,使用的是两层全连接神经网络(不计算输入层,两层网络是指一个隐藏层和一个输出层):
输入数据为28*28=784维向量,使用线性输入函数。
隐藏层含500个单元,使用relu激活函数。
输出层含10个单元,使用softmax输出函数。
此版本使用tensorflow的低层api训练模型,5,000轮迭代,每个批次100条数据,最终准确率为97.528%。
v0.2版本,网络结构与1.0版本一致。使用tensorflow的Keras API,200轮迭代,每个批次100条数据,最终准确率为96.342%。
我认为准确率不如上一个版本的主要原因是没有使用“滑动平均”等优化方式。使用Keras会缩减代码量,增加可读性。
v0.3版本,使用原生Keras API,使用CNN结构(LeNet-5),20轮迭代,每个批次128条数据,最终准确率为97.8%。
LeNet-5卷积神经网络是由两个卷积层(各含一个最大池化层)和三个全连接层组成。
v1.0版本,参考Kaggle上的一个Kernel,使用Keras + TensorFlow,CNN结构在LeNet-5的基础上进行改进。(注:红色为在LeNet-5基础上新增加的层)
Input -> C2D -> C2D -> MaxPool -> DropOut -> C2D -> C2D -> MaxPool -> DropOut -> FC -> FC ->DropOut -> Out
并且还使用了“交叉验证”、“学习率衰减”、“图片数据增强”等方式,提高模型的精度。5轮迭代,每个批次86条数据,最终准确率为99.014%。
可以看到经过以上的处理,比v0.3版本的准确率提高了1.2%,效果还是比较明显的。
除v1.0版本以外(v1.0版本只包含一个文件),之前的几个版本的程序均包含5个文件,其功能一致:
constantInit.py用于参数初始化。
dataLoad.py用于数据的加载和保存。
main.py是主程序模块。
sample_submission.csv是预测的结果,可直接提交到Kaggle上。
trainingModel.py是训练模型模块。
注意:
Kaggle的数据是整型,需要先把数据转化为浮点值。Kaggle上提供2个文件,需要将训练集进行划分:
将原训练集42,000条分为:训练集38,000条,验证集4,000条。
原测试集28,000条,数量不变,只将其转为浮点数。