节点值的生命周期

求出节点时,TensorFlow 会自动确定所依赖的节点集,并首先求出这些节点。 例如,考虑以下代码:

  1. # w = tf.constant(3)
  2. # x = w + 2
  3. # y = x + 5
  4. # z = x * 3
  5. # with tf.Session() as sess:
  6. # print(y.eval())
  7. # print(z.eval())

首先,这个代码定义了一个非常简单的图。然后,它启动一个会话并运行图来求出y:TensorFlow 自动检测到y取决于x,它取决于w,所以它首先求出w,然后x,然后y,并返回y的值。最后,代码运行图来求出z。同样,TensorFlow 检测到它必须首先求出wx。重要的是要注意,它不会复用以前的w和x的求出结果。简而言之,前面的代码求出wx两次。
所有节点值都在图运行之间删除,除了变量值,由会话跨图形运行维护(队列和读者也保持一些状态)。变量在其初始化程序运行时启动其生命周期,并且在会话关闭时结束。
如果要有效地求出yz,而不像之前的代码那样求出wx两次,那么您必须要求 TensorFlow 在一个图形运行中求出yz,如下面的代码所示:

  1. # with tf.Session() as sess:
  2. # y_val, z_val = sess.run([y, z])
  3. # print(y_val) # 10
  4. # print(z_val) # 15

在单进程 TensorFlow 中,多个会话不共享任何状态,即使它们复用同一个图(每个会话都有自己的每个变量的副本)。 在分布式 TensorFlow 中,变量状态存储在服务器上,而不是在会话中,因此多个会话可以共享相同的变量。