跟着TensorFlow的进阶级教程实现MNIST库的训练

    转载出处:http://blog.csdn.net/feifei884431/article/details/51429829html

  • 背景介绍
  • 代码实现及结果
  • 小问题 
    • ResourceExhaustedError的缘由及解决方式
    • Saver()进行模型存储及恢复
    • 再说一下DL的运行时间吧
  • 小结
  • 优质资源分享

背景介绍

作这件事的初衷有二: 
①作完入门级的,天然要进阶一下。 
②以前作到的准确率只有92%,听说进阶版能够把准确率作到99.2% 
步骤仍是参考TensorFlow的中文教程,天然没有上次那么简单,有些坑掉进去了,好歹最后爬出来了,记录一下。 
此次用的不是一个单纯的一层输入+一层输出+softmax几率映射层的三层网络。多加了了两个隐藏层以及一个全链接层,至关于6层CNN了。python


代码实现及结果

这个照着教程来作的话,感受应该也没有问题,注意一些变量名的细节好比y_conv替代了原来的y,敲出来通常就能跑通啦。 
结果的话,没有作迭代次数以及cost函数的实验啦。就简单的一行。 
这里写图片描述 
.9911的准确率,还能够吧应该。一是没有跑到2W次循环的训练,二是教程里面好像有说过他用GPU跑的结果,CPU的能够差一些。why?git


小问题

①ResourceExhaustedError的缘由及解决方式

码好以后,设置了2W的循环次数,15:17挂上开始跑,训练的速度有了明显变慢,到17:33去吃饭的时候只跑了17100次循环。饭罢回来傻眼啦,好长一串log,摘出主要的问题就是下图: 
这里写图片描述 
ResourceExhaustedError是啥子? 
这里写图片描述 
翻译过来是资源耗尽,不过不太理解,就去搜(认可没有去TensorFLow官网搜是我蠢,那里确定有相应的说明),百度没得,Stack Overflow居然也没得,后来在一个同窗的吐槽里看到了这个Error。说他开了8G内存都跑不了海量数据,我这1G的难怪会遇到这种问题。大体计算了一下,这个矩阵的尺寸是10000x28x28x32,每一个元素是一个float64占用8字节,因此这单个对象就须要占用1.87g的存储空间,还不算其余的系统运行内存和其余变量。确定崩盘啦。 
解决办法呢?就是拆分呀。其实我发现训练的时候都是拿batch=50来作,test时一下用10000太大了,个人作法就是把test数据也分了10份,每份batchsize=1000,跑10次结果取accuracy的平均。因为取数据的接口在input_data.py里写好了,剩下的就是熟悉一下TensorFlow的语法就能写好。github

accuracyResult = list(range(10))
for i in range(10):
    batch = mnist.test.next_batch(1000)
    accuResult[i] = accuracy.eval(feed_dict={x:batch[0],y_:batch[1],keep_prob:1.0})
print "Test accuracy:", numpy.mean(accuResult)

②Saver()进行模型存储及恢复

虽而后来这个拆分的test能够跑通了,不过以前训练的模型随着那个ResourceExhaustedError一并消失了,心好累。难道又要重跑(这一波必须重跑了TAT。。),难道之后都要这么伤?那就未必了。TensorFlow提供了Saver()这个类来解决Session参数的存储与恢复。具体的方法仍是看存取教程吧。 
作的时候存模型比较顺利,制定5000次迭代就存一下,新的模型也能够覆盖以前同名模型,一个模型的大小居然有38M。 
这里写图片描述 
读取模型用于继续训练或者测试时须要再说一下: 
a.tf.train.Saver()的定义须要在Session()以前,不然会提示你错误。 
b.经过tf.train.Saver().restore进行恢复时,不须要进行变量的初始化,即Session.run(tf.initialize_all_variables())不用作,不过你的变量必须事先定义好。这一点不像matlab双击一下.mat文件就能够把.mat里面的全部参数导入当前workspace,不要指望在一个新的.py文件里导入模型参数就能够直接test了。 
固然这些问题的话,只要按照存取教程作,是不会遇到的,我当时就是嘉祥成matlab,想偷懒。编程

③再说一下运行时间吧

以前还蠢蠢的移位本身的单核1G内存阿里云服务器能hold住Machine Learning,真的是太天真啦。下面对比一下用时吧,一样的MNIST库55000个train_image和10000个test_image: 
以前用入门级的3层模型来训练10000次,每次batch100,只用30s不到。 
如今用的6层卷积神经网络训练10000次,每次100个batch,用了80分钟。 
差距仍是蛮大的,更多的层数或者更多的数据就崩盘啦。其实相比日常用matlab作的通讯仿真,13W秒跑一个case,这个时间仍是能忍的哈。下次跑的时候也应该像matlab那样tic,toc一下,省得我本身手表计时啦。api


小结

这两天作的也比较匆忙,只是实现了教程里面的入门内容,完成了个Hello World而已。若是作的有问题欢迎你们批评指正哈。接下来还有挺多须要学习,首要的两条: 
①流程框图,通讯里面能够经过流程框图来描述一个系统,直观高效。以前实现的部分顶多算识别的一小块,真正的一个应用确定还须要其余模块,图片获取、图片预处理(定位/size/去噪)、识别信息的转化及应用等。 
②NN,CNN的基础知识须要再巩固。服务器


优质资源分享

深度学习路线看看大牛怎么说。 
视觉信息介绍,又一个典型的外国大牛写的深刻浅出的理论分析,我也正在学习。虽然有些知识之前知道,不过看的目的是 巩固 or 从另外一个角度看待问题。 
Stack Overflow 听说编程过程当中遇到的95%的问题都能在这里找到。网络

Tensor的官网,TensorFlow函数介绍文档中文社区 
另外一个教程,我就是从这儿找到TensorF中文社区的函数

相关文章
相关标签/搜索