内容参考自北京大学曹健教授的tensorflow课程,在此感谢
之前在人工智能课上自己手动搭建过一个BP神经网络实现MNIST数据集的手写体数字识别,使用的是c++
,最终准确率的上限在95%至96%
左右(毕竟水平有限)。这次不一样了,使用tensorflow
进行实验,准确率确实提高了不少。可能有人会觉得tensorflow
有点过时,现在的大企业不怎么用tensorflow
了,但我觉得,对于初学者来说,tensorflow
还是不错的选择。
实验环境
- ubuntu 16.04
- python 2.7.13
- tensorflow 1.3.0
- MNIST数据集
我不清楚windows下可不可以装tensorflow,反正很久以前是不行,现在好像可以了???
总体框架
主要分为三个部分如下:
- 前向传播过程(mnist_forward.py)
- 进行网络参数优化方法的反向传播过程 ( mnist_backward.py )
- 验证模型准确率的测试过程(mnist_test.py)
每个部分都单独写成了一个模块文件。
源代码
mnist_forward.py
|
|
mnist_backward.py
|
|
mnist_test.py
|
|
代码解析
mnist_forward.py
|
|
在前向传播过程中,规定网络输入结点为 784 个(代表每张输入图片的像素个数),隐藏层节点 500 个(一层),输出节点 10 个(表示输出为数字 0-9的十分类)
|
|
参数满足截断正态分布
|
|
使用正则化,将每个参数的正则化损失加到总损失中
mnist_backward.py
|
|
softmax()函数与交叉熵一起使用,再加上正则化损失以此计算得到总的偏差值
|
|
使用指数衰减学习率使模型在训练的前期快速收敛接近较优解
|
|
使用梯度下降算法
|
|
在模型训练时引入滑动平均使模型在测试数据上表现的更加健壮
|
|
|
|
|
|
断点续训,因为训练时间比较长,万一断电了呢。。。为了使得之前训练好的参数(w,b)能够保留下来,调用了saver进行保存和恢复
mnist_test.py
|
|
|
|
每隔五秒钟测试一次
|
|
实例化具有滑动平均的 saver 对象,从而在会话被加载时,模型中的所有参数被赋值为各自的滑动平均值,增强模型的稳定性
操作步骤
可能你已经注意到了,mnist_forward.py中并没有main函数(说明这个文件只是一个模块用来被其他文件调用,本例中是mnist_backward.py调用了mnist_forward.py),而另两个文件都有main函数。
- 终端输入
python mnist_backward.py
,开始训练,会显示实时的损失值,如:after 15005 training steps, loss on training batch is 0.159981
- 再开一个终端,输入
python mnist_test.py
,进行同步的测试(每五秒一次),会显示实时的损失值,如:after 15005 training steps, test accuracy = 0.979
实验结果
代码里设置的总循环数是50000次,但是我只跑到15000次(毕竟时间比较久),但已经能有98%的准确率了,如果全跑完的话,预计能达到99%以上。