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条,数量不变,只将其转为浮点数。

 

posted on 2019-06-21 20:52  Sempron2800+  阅读(321)  评论(0编辑  收藏  举报