Session.run()如何选择要运行的子图

时间:2018-01-26 16:28:58

标签: python variables tensorflow graph variable-assignment

我试图了解Session.run()在Tensorflow流程中的工作原理。我知道Session.run()运行我们给它的“fetch”参数指定的子图。由于取决于子图的哪个部分首先执行,我们可能得到不同的结果,我试图看看是否真的如此。假设我们比较这段代码的输出:

import tensorflow as tf

x = tf.Variable(42)
assign1 = tf.assign(x, 13)
assign2 = tf.assign(x, 14)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    val1, val2, val3 = sess.run([x, assign1, assign2])
    print(val1, val2, val3)

使用此代码:

import tensorflow as tf

x = tf.Variable(42)
assign2 = tf.assign(x, 14)
assign1 = tf.assign(x, 13)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    val1, val2, val3 = sess.run([x, assign1, assign2])
    print(val1, val2, val3)

(唯一的变化是分配14在第二个代码中排在第一位)。我期待看到第一个代码产生输出14,14,14,而第二个代码产生13,13,13。

然而,结果是第一次产生13,13,13而第二次产生14,14,14。

为什么会这样?

更新:选择答案后:

我不太了解什么是独立的,什么不是。例如,在以下代码中:

x = tf.Variable([1, 2, 3, 4, 5])

def foo():
    tmp_list = []
    assign = tf.assign(x[4], 100)
    for i in range(0, 5):
        tmp_list.append(x[i])
    return tmp_list

z = foo()

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    val1, val2 = sess.run([z, assign])
    print(val1, val2)

在我的Session.run()中,我同时拥有z和assign。要获得z,我需要foo()。运行foo()时,也会运行assign = tf.assign(x[4], 100)。但是,输出为[1, 2, 3, 4, 5] 13,我不知道13来自哪里。

1 个答案:

答案 0 :(得分:1)

无保证首先执行哪些独立操作,因此在这两种情况下都可以获得13或14。你的结果是纯粹的运气。试试这个:

with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  for i in range(100):
    val1, val2, val3 = sess.run([x, assign1, assign2])
    print(val1, val2, val3)

...你会看到13 14打印出来。

后续问题的更新

z = foo()(只是x切片列表)不依赖于assign。请注意,foo在会话启动前只调用一次。我认为,最好看到它是在张量板中可视化图形。

如果你说......

sess.run(z)

... tensorflow不会运行assign,因为它不运行python函数,它会评估张量。张量xx[i]不依赖于操作assign

依赖关系由使用张量执行的操作定义。所以,如果你有......

y = x + 2

...此 依赖项:为了评估y,tensorflow必须评估x。希望现在能让它变得更加清晰。