tensorflow学习存在的问题

来源:互联网 发布:专业知乎 编辑:程序博客网 时间:2024/05/07 08:47

跟着TensorFlow的入门级教程实现MNIST库的训练

本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:

  • 实验环境
  • 实验Case介绍
  • 代码及实现结果
  • 两个小问题
  • 优质资源分享

实验环境

一直对MachineLearning感兴趣,也从网上找了一些资料,学了一些基本理论,不过对于ML的把握还是比较抽象,最近特别想找点儿case来实践一发。
最先找到的是wphh大神写的人脸识别的case,里面用的Python+numpy+theano+PIL开发环境,做了计算机视觉方面的事儿,赞啊喜欢!不过Theano这个东西安装起来问题多多,在windows上有挺多依赖库没安好。在虚拟机CentOS上基本安完了(自带的testCase大约有80%以上的通过率)。不过wphh的代码里面bug比较多,对于我这种初学者调起来比较费劲于是就不了了之了。
又找到了基于TensorFlow的一系列相关实践教程,TensorFlow是google去年11月发布并且开源的一套酷,google在机器学习方面还是领军的感觉,就它了(主要是这个环境配好了能跑得动我才来写的博客)。

关于环境
硬件方面:单核CPU,1G内存,40G硬盘,没错就是阿里云。
软件:CentOS7.0,python2.7.5,TensorFlow0.5。
直接照着教程里面的下载安装步骤进行的,可能由于之前Theano把一些基本库都安好了,所以安的很顺利,否则可能需要根据提示下载依赖库:pil,numpy,scipy,cython,blas之类的。哦对了TensorFlow好像是基于python2.x的,python3的兼容性如何还不太了解。

实验Case介绍

用的是MNIST这个库,里面有6W张手写数字,要做的是一个识别手写数字的事儿,听起来比较low,不过真正能理解其中的算法应该充满挑战,我目前是抱着实践一下做个HelloWorld的心态来膜拜的。具体的case介绍还是看教程吧。

代码实现及结果

关于代码,由于教程是翻译的google原版,所以可以从google那边的英文教程获得,以及对应的代码服务器。一开始蠢了,把每个.py文件下载下来上传到我的git再由阿里云那边clone到本地。后来发现google不是开源了吗,可以直接在google的git仓库找到你要的所有。

按照教程介绍的,原封不动的把代码敲到一个新的py文件中运行,就可以得到预期的一个小数的输出,就是用你构造的模型获得的预测结果。具体的代码解释及softmax算法分析教程里说的比较详细,我就不赘述啦。
这里写图片描述
结果虽然虽然出来了,不过对我来说是黑盒子,因为没有看过tensorflow的内部源代码(虽然已经开源)。针对softmax算法的话,做了一下实验。主要是统计迭代次数与判决准确率之间的关系,如下图所示。
这里写图片描述

问题

问题①
在统计结果的时候发现对于相同的迭代次数,输出的结果有时候会出现差异。why?这个算法不稳定?之前做消息传递MPA译码的时候,对于特定的输入输出结果都是不变的,是稳定的算法。这个问题是为啥?
首先模型先验信息或者说初始化是一样的,一个全0的模型w和b。那么问题应该出在训练数据的顺序或者softmax算法或者梯度下降算法的稳定性上。
我就去看了下数据选择input_data.py文件,其中的next_batch方法里面发现了问题:
这里写图片描述
也就是说每次迭代训练的过程中,输入数据的顺序是打乱了的,所以这可能会对模型有一定影响。这个操作非常像Turbo编码里面的交织,每当循环训练过一次全部数据时就会shuffle一次。使得下一次循环输入的序列变得不一样。这属于认为增大输入训练集的方法吗?关于softmax和梯度下降的算法。自己理解不深,留作问题以后解决吧还是。

问题②
关于模型训练中的cost选择的问题,教程里面说到用的是交叉熵cross_entropy,
cross_entropy=iy~ilog(yi)
这个公式不太理解,确实能解出结果。但是我们通信里面最常用的MMSE也是用来描述两个量之间的差异,同样是要最小化差异,我觉得MMSE也应该不错呀。
MMSE=miny~iyi2
于是我就在教程的基础上加了一个MMSE的准则,然后用重新训练了一下模型并且对比二者的结果。
MMSE的代码就是对照交叉熵写的,不难。

MMSE = tf.pow(tf.sub(y,y_),2)train_step = tf.train.GradientDescentOptimizer(0.01).minimize(MMSE)
  • 1
  • 2

然后,同样的,对比了一下模型训练次数与最后的准确率的关系:
这里写图片描述
可以发现,MMSE的话,在迭代次数不足(10)的时候,性能不太理想,不过50次以上的话训练的结果都略微比交叉熵的好一些。哈哈。不错,也算优化了一下模型呢。

问题③
模型训练时间的问题:
TensorFlow和Theano都支持GPU运算,毕竟GPU相对CPU对浮点数的运算处理有一定优化。而。。对,我的环境跟没没得GPU。
我本来觉得单核1G内存的话,基本做机器学习白瞎,没想到TensorFlow的话还是比较快,比如我训练迭代10000次的模型建立也花不到30s的实际,当然啦有可能是TensorFlow优化的好,有可能是这个模型太弱鸡,达不到DeepLearning的水平,也有可能是阿里云的弹性服务器运算能力的体现。不过我用的ts0.5版本的,按理说0.8版本才支持分布式计算处理。不懂,反正目前的结论是能跑得动,可能后面的话就会崩盘。比如接下来如果做CIFAR10这个库的时候就会慢很多?

1 0
原创粉丝点击