Tensorflow:sess.run中带有列表的变量赋值何时完成?

Sar*_*rah 10 python variables timing variable-assignment tensorflow

我认为变量赋值是在给sess.run的列表中的所有操作之后完成的,但是下面的代码在不同的执行时返回不同的结果.它似乎在列表中随机运行操作,并在列表中运行操作后分配变量.

a = tf.Variable(0)
b = tf.Variable(1)
c = tf.Variable(1)
update_a = tf.assign(a, b + c)
update_b = tf.assign(b, c + a)
update_c = tf.assign(c, a + b)

with tf.Session() as sess:
  sess.run(initialize_all_variables)
  for i in range(5):
    a_, b_, c_ = sess.run([update_a, update_b, update_c])
Run Code Online (Sandbox Code Playgroud)

我想知道变量赋值的时间.哪个是正确的:"update_x - > assign x - > ... - > udpate_z - > assign z"或"update_x - > udpate_y - > udpate_z - > assign a,b,c"?(其中(x,y,z)是(a,b,c)的排列)此外,如果有一种方法可以实现后一种分配(在完成列表中的所有操作后完成分配),请让我知道如何实现它.

mrr*_*rry 16

这三个操作update_a,update_b以及update_c在数据流图中没有相互依存关系,所以TensorFlow可以选择以任意顺序来执行它们.(在当前的实现中,它们可能会在不同的线程上并行执行.)第二个缺点是默认情况下缓存了变量的读取,所以在你的程序中,update_b(ie c + a)中赋值的值可能会使用原始值或更新值a,取决于首次读取变量的时间.

如果要确保以特定顺序with tf.control_dependencies([...]):执行操作,可以使用块强制执行在块中创建的操作在列表中指定的操作之后发生.您可以tf.Variable.read_value()with tf.control_dependencies([...]):块内部使用以显示变量读取的点.

因此,如果你想确保update_a在之前update_bupdate_b之前发生过update_c,你可以这样做:

update_a = tf.assign(a, b + c)

with tf.control_dependencies([update_a]):
  update_b = tf.assign(b, c + a.read_value())

with tf.control_dependencies([update_b]):
  update_c = tf.assign(c, a.read_value() + b.read_value())
Run Code Online (Sandbox Code Playgroud)

  • 啊,我知道这为什么令人困惑。当您一次调用`sess.run([x,y,z])`时,TensorFlow会执行每个张量仅依赖于一次的操作(除非您的图中有`tf.while_loop()`)。如果张量在列表中出现两次(例如您的示例中的“ mul”),TensorFlow将对其执行一次并返回结果的两个副本。要多次运行分配,您必须多次调用`sess.run()`或使用`tf.while_loop()`在图形中放置一个循环。 (2认同)