---恢复内容开始---
当我们编写tensorflow代码时, 总是定义好整个计算图,然后才调用sess.run()去执行整个定义好的计算图, 那么有两个问题:一是当执行sess.sun()的时候, 程序是否执行了计算图上的所有节点呢?二是sees.run()中的fetch, 为了取回(Fetch)操作的输出内容, 我们在sess.run()里面传入tensor, 那这些tensor的先后顺序会影响最后的结果嘛?比如有些tensor是有先后执行关系的,如果置于后面,会重复计算嘛?
请看实验:
import tensorflow as tf
state = tf.Variable(0.0,dtype=tf.float32)
one = tf.constant(1.0,dtype=tf.float32)
new_val = tf.add(state, one)
update = tf.assign(state, new_val) #返回tensor, 值为new_val
update2 = tf.assign(state, 10000) #没有fetch,便没有执行
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
for _ in range(3):
print(sess.run([update,state, new_val]))
print("--------")
程序输出的结果为:
[1.0, 1.0, 1.0]
--------
[2.0, 2.0, 2.0]
--------
[3.0, 3.0, 3.0]
--------
从结果可知:
首先, update2这个tensor并没有执行,因为它不在sess.run()的fetch列表中。
对于sess.sun(fetch), 只有fetch里的图元素, 才会被执行, 不在fetch中的图节点是不会执行的
其次, 当我们将sess.run()里面的fetch列表中的节点打乱时, 取出来的值依然是一次流程图计算出来的结果
当sess.run() 里面的fetch是一个list时, 无论是update在前, 还是state在前, 不会执行update之后看到state在update后面就在执行一次state, 都是在这个list中的节点在流程图中全部执行完之后在取值的。
在看实验:
import tensorflow as tf
state = tf.Variable(0.0,dtype=tf.float32)
one = tf.constant(1.0,dtype=tf.float32)
new_val = tf.add(state, one) # 1
update = tf.assign(state, new_val) #返回tensor, 值为new_val #update 1 # state 1
update2 = tf.assign(state, 10000) #没有fetch,便没有执行 # update2 10000 # state 10000
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
for _ in range(1):
print(sess.run([state, new_val, update2, update]))
print("--------")
结果为:
[10001.0, 10001.0, 10001.0, 10001.0]
--------
分析: 程序不是从上到下依次执行的, tensorflow里面是按照计算图而流动计算的, 画出程序的计算图就可以知道, 最先开始执行的操作是update2这个节点, 然后是add这个节点。 最后tf.assign()是当流程图都走完之后进行取值的
---恢复内容结束---