我想使用变量的旧值和新值。但我是
关于何时应用Assign Op
感到困惑。
这是一个简单的例子。 output
和output2
的输出不同。
v = tf.Variable(0)
with tf.Session() as sess:
sess.run(v.initializer)
new_v = v.assign(v + 10)
output = v + 0 # `v` is evaluated before the assignment ?
output2 = v # `v` is evaluated after the assignment ?
print(sess.run([ output, output2, new_v]))
print(sess.run(output))
结果是
[0,10,10]
10
请告诉我使用旧值和变量的新值的正确方法是什么。感谢。
根据chrisz的回答,我尝试tf.control_dependencies
获取v
的旧值。但结果并不是我的预期。我仍需要将0
添加到v
以获取旧值。
这是测试代码。我添加0
以获得与上面相同的结果。否则,output_old
的结果将为10
v = tf.Variable(0)
with tf.Session() as sess:
sess.run(v.initializer)
output_old = v + 0 # If I want the old value, this extra add is needed
with tf.control_dependencies([output_old]):
new_v = v.assign(v + 10)
output_new = new_v
print(sess.run([output_old, output_new, new_v]))
print(sess.run(output_old))
答案 0 :(得分:1)
首先,当提取是独立的时,通常无保证,计算它们的顺序(具有类似情况的question)。
例如,如果您在循环中运行脚本,可能偶尔会得到[10, 10, 10]
,这意味着首先评估new_v
。在我的计算机上,我无法output2
评估为0
,因此它最有可能实现功能,但如果它从平台更改为平台,我会感到惊讶平台或从版本到版本。唯一保证的值为new_v
,始终为10
; output
和output2
都可以是0
或10
。
要回答您的问题,同时获取这两个值的最佳方法是添加另一个变量并使用tf.control_dependencies
上下文:
v = tf.Variable(0)
tmp = tf.Variable(0)
with tf.Session() as sess:
sess.run([v.initializer, tmp.initializer])
saved_v = tmp.assign(v)
with tf.control_dependencies([saved_v]):
new_v = v.assign(v + 10)
old_v = tf.identity(saved_v)
# At this point, `new_v` is guaranteed to be 10,
# `old_v` and `saved_v` are guaranteed to be 0
请注意,如果没有tf.control_dependencies
,它将无法完成一般工作,因为old_v
和saved_v
可以在new_v
之后进行评估。依赖于output_old = v + 0
的诀窍也有效,但它看起来更像是对我的黑客攻击。无论如何,您无法避免tf.control_dependencies
。