gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:14:38 25 4
gpt4 key购买 nike

我想使用变量的旧值和新值。但我是对何时应用 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

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


根据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))

最佳答案

首先,当提取是独立的时,通常无法保证它们的计算顺序(类似情况下的 question)。

例如,如果您在循环中运行脚本,您可能偶尔会得到 [10, 10, 10],这意味着首先评估 new_v。在我的机器上,我无法让 output2 评估为 0,因此它很可能是实现功能,但如果它因平台而异或从一个版本到另一个版本。唯一保证的值是 new_v,它永远是 10outputoutput2 都可以是 010

要回答您的问题,同时获取两个值的最佳方法是添加另一个变量并使用 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 的技巧也有效,但对我来说它看起来更像是 hack。在任何情况下,您都无法避免 tf.control_dependencies

关于python - 如何在Tensorflow中使用变量的旧值和新值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49165112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com