如何在 Tensorflow 中使用变量的旧值和新值?



我想使用变量的旧值和新值。但我是 对何时应用Assign Op感到困惑。

下面是一个简单的示例。outputoutput2的输出是不同的。

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

请告诉我使用变量的旧值和新值的正确方法是什么。谢谢。


根据克里斯的回答,我试图tf.control_dependencies得到v的旧值。但结果不是我所期望的。我仍然需要向v添加0才能获得旧值。

这是测试代码。我添加了一个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))

首先,当提取是独立的时,通常不能保证它们的计算顺序(类似情况的问题)。

例如,如果你在循环中运行脚本,你可能偶尔会得到[10, 10, 10],这意味着首先评估new_v。在我的机器上,我无法output2评估0,所以它很可能是实现功能,但如果它从一个平台到另一个平台或从一个版本到另一个版本发生变化,我不会感到惊讶。唯一保证的值是new_v它将始终10;outputoutput2都可以是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_vsaved_v可以在new_v后进行评估。你依赖output_old = v + 0的技巧也有效,但对我来说更像是黑客。无论如何,你无法避免tf.control_dependencies.

相关内容

  • 没有找到相关文章

最新更新