节点值的生命周期
求出节点时,TensorFlow 会自动确定所依赖的节点集,并首先求出这些节点。 例如,考虑以下代码:
# w = tf.constant(3)
# x = w + 2
# y = x + 5
# z = x * 3
# with tf.Session() as sess:
# print(y.eval())
# print(z.eval())
首先,这个代码定义了一个非常简单的图。然后,它启动一个会话并运行图来求出y
:TensorFlow 自动检测到y
取决于x
,它取决于w
,所以它首先求出w
,然后x
,然后y
,并返回y
的值。最后,代码运行图来求出z
。同样,TensorFlow 检测到它必须首先求出w
和x
。重要的是要注意,它不会复用以前的w和x的求出结果。简而言之,前面的代码求出w
和x
两次。
所有节点值都在图运行之间删除,除了变量值,由会话跨图形运行维护(队列和读者也保持一些状态)。变量在其初始化程序运行时启动其生命周期,并且在会话关闭时结束。
如果要有效地求出y
和z
,而不像之前的代码那样求出w
和x
两次,那么您必须要求 TensorFlow 在一个图形运行中求出y
和z
,如下面的代码所示:
# with tf.Session() as sess:
# y_val, z_val = sess.run([y, z])
# print(y_val) # 10
# print(z_val) # 15
在单进程 TensorFlow 中,多个会话不共享任何状态,即使它们复用同一个图(每个会话都有自己的每个变量的副本)。 在分布式 TensorFlow 中,变量状态存储在服务器上,而不是在会话中,因此多个会话可以共享相同的变量。