计算图与会话
Last updated
Last updated
上篇文章中我们用Tensorflow实现了“Hello,world!”的打印输出,但是对于其中的很多概念以及Tensorflow的运行机制都是轻描淡写一笔带过,本文我们将对这些概念及机制作一个详细介绍。
Tensorflow,顾名思义,由两部分组成,Tensor(张量)和 flow(计算流)。Tensorflow中的一切常量与变量都是张量,或者说节点。由这些通过运算符构建一个网络,我们称之为计算图。比如我们定义两个常量x和y,然后变量z=x+y。那么对应的计算图如下:
此时我们定义好了x,y,z之间的计算关系,得到一个计算图,但事实上,x,y,z并未实际计算。什么意思呢?我们用代码简单的解释一下,相信大家就明白了。
可以看到,x,y,z都是一个Tensor张量,或者说计算图节点。x和y的输出结果中第一个为Const,表示该节点是常量,z的输出结果第一个为add,表示该节点为相加后的输出结果。也就是说,x,y,z三者都是计算图中的节点,它们共同构成了一个计算图,该计算图定义了三者之间的计算关系,但并未实际运算。
那么,我们怎么让这个计算图计算并得到我们想要的输出结果呢?这就需要用到会话了。Tensorflow构建好一个计算图后,需要定义一个会话环境,然后将计算图拿到会话环境中运行。
我们用tf.Session()定义一个会话环境并赋给sess,会话在计算完毕后需要用close()方法关闭会话。我们也可以用with上下文管理器来管理会话环境,with上下文管理器在程序执行完with结构里的代码后会自动关闭回话,如此我们并不用显示关闭会话,避免了由于忘记关闭会话导致的异常。代码如下:
tf.Session()需要在定义好所有计算图后才能定义会话并运行,那么,如果我在运行会话的过程中需要插入一个新的计算图该怎么做呢?比如,我们在运行会话时定义新的变量w,并令w=x+y+z。此时,我们可以用tf.InteractiveSession()。代码如下:
在交互式环境(比如终端)中,tf.InteractiveSession()是一个很棒的函数,允许我们可以随时定义新的计算图,随时运行计算图,但需要注意的是,tf.InteractiveSession()定义的会话需要在计算结束后显式调用close()函数关闭会话。