我有一些非常简单的代码行,却产生了非常奇怪且意想不到的行为:
import tensorflow as tfy = tf.Variable(2, dtype=tf.int32)a1 = tf.assign(y, y + 1)a2 = tf.assign(y, y * 2)with tf.control_dependencies([a1, a2]): t = y+0with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(4): print('t=%d' % sess.run(t)) print('y=%d' % sess.run(y))
预期的输出是
t=6y=6t=14y=14t=30y=30t=62y=62
但第一次运行时,我得到的是:
t=6y=6t=13y=13t=26y=26t=27y=27
第二次运行时,我得到的是:
t=3y=3t=6y=6t=14y=14t=15y=15
第三次运行时,我得到的是:
t=6y=6t=14y=14t=28y=28t=56y=56
非常荒谬,多次运行产生了多种不同的输出序列,非常奇怪,有人能帮忙吗?
编辑:改为
import tensorflow as tfimport osy = tf.Variable(2, dtype=tf.int32)a1 = tf.assign(y, y + 1)a2 = tf.assign(y, y * 2)a3 = tf.group(a1, a2)with tf.control_dependencies([a3]): t = tf.identity(y+0)with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(4): print('t=%d' % sess.run(t)) print('y=%d' % sess.run(y))
…仍然无法正常工作。
奇怪的是这段代码:
a1 = tf.assign(y, y + 1)with tf.control_dependencies([a1]): a2 = tf.assign(y, y * 2) with tf.control_dependencies([a2]): t = tf.identity(y)
…可以正常工作,但如果简单地将a2
移到前面,如下所示:
a1 = tf.assign(y, y + 1)a2 = tf.assign(y, y * 2)with tf.control_dependencies([a1]): with tf.control_dependencies([a2]): t = tf.identity(y)
…就无法正常工作了。
回答:
你的方法的问题在于a1
和a2
的顺序也很重要:你希望a1
在a2
之前被评估。tf.control_dependencies([a1, a2])
保证t
在a1
和a2
之后执行,但它们本身可以以任意顺序被评估。
我建议使用明确的依赖关系,如下所示:
y = tf.Variable(2, dtype=tf.int32)a1 = tf.assign(y, y + 1)with tf.control_dependencies([a1]): a2 = tf.assign(y, y * 2) with tf.control_dependencies([a2]): t = tf.identity(y)with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(4): print('t=%d' % sess.run(t)) print('y=%d' % sess.run(y))
输出:
t=6y=6t=14y=14t=30y=30t=62y=62