这个系列主要是对TensorFlow进行学习,了解其内部机制、运行方法,最后能根据自己的想法构建模型。
本文主要的介绍内容是TensorFlow的Graph和Session两个概念,即运算图和会话。
TensorFlow哲学:将计算图的定义和执行分离。
阶段一:运算图的定义
阶段二:使用session会话执行运算图的操作
Tensor是一个n维的数组
让我们看一个简单的计算图
在TensorBoard的模型可视化结果中,结点通常表示操作、变量以及常量;边表示张量tensors。
这些tensor表示的是数据,TensorFlow = tensor + flow = data + flow.
从上面图中我们可以知道,直接打印a并不能得到真正的计算结果8,这也证实了TensorFlow计算图和执行过程确实是分离的。
那么,我们如何才能得到计算结果a的值呢?
创建一个Session会话:在会话中可以执行运算图,从而得到a的计算结果值(8)。具体方法就是:
import tensorflow as tf
a = tf.add(3, 5)
sess = tf.Session()
print(sess.run(a)) >> 8
sess.close()
也可以换种写法:
import tensorflow as tf
a = tf.add(3, 5)
with tf.Session() as sess:
print(sess.run(a))
接下来,我们来看一下tf.Session()这个函数。
tf的Session对象封装了TF的执行环境,在环境中可以执行各种操作以及计算各种张量。此外,Session会话还将分配内存以存储变量的当前值。
这个运算图完成的计算为:(x*y)^{x+y} 。
让我们在看一个更复杂的图:
在这个图中又定义了一个useless操作,但是我们希望执行的计算是z。在TF运行时,pow_op结点的计算过程并不依赖于useless,因此,会话sess在执行过程中不会执行useless的运算,这样就可以减少不必要的运算过程。
那么,如果我们想要同时计算useless和pow_op,应该怎么做呢?
sess.run函数的API为:
fetches是一个列表,其中包含我们想要执行的计算。因此,我们可以在sess.run([])列表里添加pow_op, useless。
TensorFlow可以将运算图分解为几个块,然后在多个CPU,GPU,TPU或其他设备上并行运行它们。比如:
为了方便划分子块的并行计算,我们可以指定它们的执行设备,
到目前为止,我们只有一个运算图,我们能不能创建多个运算图呢?答案是可以的,但是不推荐,理由如下:
我们可以自己创建运算图:
g = tf.Graph()
如果想要在默认图中进行操作,需要执行:
g = tf.get_default_graph()