tensorflow会话运行张量列表的顺序是什么?

gau*_*clb 6 python tensorflow

请参阅代码段:

import tensorflow as tf

x = tf.Variable(1)
op = tf.assign(x, x + 1)

with tf.Session() as sess:
  tf.global_variables_initializer().run()
  print(sess.run([x, op]))
Run Code Online (Sandbox Code Playgroud)

有两种可能的结果:

  • x = 1且op = 2
  • x = 2且op = 2

它们取决于评估的顺序,对于第一种情况,x在之前进行评估op,对于第二种情况,x在之后进行评估op.

我已多次运行代码,但结果总是如此x=2 and op=2.所以我想这tensorflow可以保证x在之后进行评估op.这样对吗?如何tensorflow保证依赖?

更新

对于上面的情况,结果是确定的.但在以下情况中,结果并不确定.

import tensorflow as tf

x = tf.Variable(1)
op = tf.assign(x, x + 1)
x = x + 0                   # add this line

with tf.Session() as sess:
  tf.global_variables_initializer().run()
  for i in range(5):
    print(sess.run([x, op]))
Run Code Online (Sandbox Code Playgroud)

在第一个代码中,xVariableop依赖于x,因此x总是在之后进行评估op.但在第二种情况下,x变为Tensor,op依赖于Variable x(之后x = x + 0,x被覆盖).所以op不依赖于Tensor x.

xdu*_*ch0 2

张量的求值顺序是未定义的。请参阅API 文档(位于最底部的“返回”信息中Session.run()​​)。因此,您不应依赖它们按特定顺序执行。如果您需要保证顺序,您可能应该run对不同的张量/操作使用单独的调用。

  • 您还可以使用 tf.control_dependency 来强制操作之间的相对顺序。 (2认同)