我试图了解 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 和 allocate。为了获得 z,我需要 foo()。当 foo() 运行时,也会运行 assign = tf.assign(x[4], 100)
。但是,输出是 [1, 2, 3, 4, 5] 13
,我不知道 13 来自哪里。
最佳答案
无法保证首先执行哪一个独立操作,因此在这两种情况下您都可以获得 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
在 session 启动之前仅被调用一次。我认为,最好的方式是在张量板上可视化该图。
如果你说...
sess.run(z)
...tensorflow 不会运行 assign
,因为它不运行 python 函数,而是计算张量。并且张量x
或x[i]
不依赖于操作分配
。
依赖性是由使用张量执行的操作定义的。所以如果你有...
y = x + 2
...这个是依赖项:为了计算y
,tensorflow必须计算x
。希望现在可以更清楚了。
关于python - Session.run() 如何选择要运行的子图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48465510/