Sar*_*rah 10 python variables timing variable-assignment tensorflow
我认为变量赋值是在给sess.run的列表中的所有操作之后完成的,但是下面的代码在不同的执行时返回不同的结果.它似乎在列表中随机运行操作,并在列表中运行操作后分配变量.
a = tf.Variable(0)
b = tf.Variable(1)
c = tf.Variable(1)
update_a = tf.assign(a, b + c)
update_b = tf.assign(b, c + a)
update_c = tf.assign(c, a + b)
with tf.Session() as sess:
sess.run(initialize_all_variables)
for i in range(5):
a_, b_, c_ = sess.run([update_a, update_b, update_c])
Run Code Online (Sandbox Code Playgroud)
我想知道变量赋值的时间.哪个是正确的:"update_x - > assign x - > ... - > udpate_z - > assign z"或"update_x - > udpate_y - > udpate_z - > assign a,b,c"?(其中(x,y,z)是(a,b,c)的排列)此外,如果有一种方法可以实现后一种分配(在完成列表中的所有操作后完成分配),请让我知道如何实现它.
mrr*_*rry 16
这三个操作update_a,update_b以及update_c在数据流图中没有相互依存关系,所以TensorFlow可以选择以任意顺序来执行它们.(在当前的实现中,它们可能会在不同的线程上并行执行.)第二个缺点是默认情况下缓存了变量的读取,所以在你的程序中,update_b(ie c + a)中赋值的值可能会使用原始值或更新值a,取决于首次读取变量的时间.
如果要确保以特定顺序with tf.control_dependencies([...]):执行操作,可以使用块强制执行在块中创建的操作在列表中指定的操作之后发生.您可以tf.Variable.read_value()在with tf.control_dependencies([...]):块内部使用以显示变量读取的点.
因此,如果你想确保update_a在之前update_b和update_b之前发生过update_c,你可以这样做:
update_a = tf.assign(a, b + c)
with tf.control_dependencies([update_a]):
update_b = tf.assign(b, c + a.read_value())
with tf.control_dependencies([update_b]):
update_c = tf.assign(c, a.read_value() + b.read_value())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2639 次 |
| 最近记录: |