我试图了解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来自哪里。
答案 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函数,它会评估张量。张量x
或x[i]
不依赖于操作assign
。
依赖关系由使用张量执行的操作定义。所以,如果你有......
y = x + 2
...此 依赖项:为了评估y
,tensorflow必须评估x
。希望现在能让它变得更加清晰。