文章仅用于记录个人TensorFlow学习的问题和自己的理解。
今天的歌如约而至
TensorFlow,Google的深度学习框架,本机使用版本为TensorFlow-gpu 1.6.0,Python 3.6.4。
那就开始吧_
如下图:graph(图)来表示计算任务,在Session(会话)中执行图。tensor表示数据,Variable(变量)用来维护状态,feed和fetch用来赋值和获取数据。一个TensorFlow程序分成两个阶段,一是构建阶段,二是执行阶段。构建阶段和执行阶段就好像煮米饭,构建就是把材料准备好,先把水米放在锅里,执行阶段就是点下开始按钮,开始煮米饭。
而在构建图阶段,图里的主要元素是op(operation),op和op相连接形成复杂的计算任务。TensorFlow有一个默认图,一般程序就使用默认图就可以了。自认为构建好的图就相当于把东西一个个摆好,形成网络结构。执行阶段中,则创建会话,将图放在会话中进行run(运行),则开始计算。具体的看下面链接啦。
自己画的图1下面是我碰到的小问题:
问题1: 有关tf.sub(),tf中不存在sub().
这个问题很好解决,是因为TensorFlow的版本问题,sub()
这个接口已经弃用了,改成了subtract()
。
问题2:tf.add()
报错[pylint] Module has no member add
有了前车之鉴,出现这个问题首先我就想是不是接口弃用了,然而并不是,搜的时候这个问题好像其他人并没有出现这个问题。后来连着[pylint]一起搜才找到,其实是pylint的问题。
Pylint---Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在问题的代码。 Pylint 是一个 Python 工具,除了平常代码分析工具的作用之外,它提供了更多的功能:如检查一行代码的长度,变量名是否符合命名标准,一个声明过的接口是否被真正实现等等。 Pylint 的一个很大的好处是它的高可配置性,高可定制性,并且可以很容易写小插件来添加功能。如果运行两次 Pylint,它会同时显示出当前和上次的运行结果,从而可以看出代码质量是否得到了改进。 目前在 eclipse 的 pydev 插件中也集成了 Pylint。
出现这个问题的原因就是, 在当报错的对象是动态创建的,并且确实是在访问的同时已经存在的时候pylint仍然会报出E1101的错误 。
修改:在源码的第一行添加 # pylint: disable=no-member
参考博客
问题3:运行MINIST,无法导入input_data包。
原因:input_data是一个导入数据的工具包,所以需要在自己的项目下添加 input_data.py 的文件,然后才可以。源码我会一起放在github上。
貌似: from tensorflow.examples.tutorials.mnist import input_data
这样也可以,没有试验,看的人自行检验吧~
问题4:添加好了input_data,出现了 input_data.py only integer scalar arrays can be converted to a scalar 这个错误。
解决方案是将input_data.py
下面函数:
def _read32(bytestream):
dt = numpy.dtype(numpy.uint32).newbyteorder('>')
return numpy.frombuffer(bytestream.read(4), dtype=dt)
修改为:
def _read32(bytestream):
dt = numpy.dtype(numpy.uint32).newbyteorder('>')
return numpy.frombuffer(bytestream.read(4), dtype=dt)[0]
最后的结果:
结果图2
我的github
好啦~其实昨天我就把这些问题整理完了,不过是在公众号上,可惜公众号一刷新,什么都木有了,心痛到劈叉。
网友评论