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

时间:2018-03-08 03:53:01

标签: python variables tensorflow assign control-flow

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

1 个答案:

答案 0 :(得分:1)

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

例如,如果您在循环中运行脚本,可能偶尔会得到[10, 10, 10],这意味着首先评估new_v。在我的计算机上,我无法output2评估为0,因此它最有可能实现功能,但如果它从平台更改为平台,我会感到惊讶平台或从版本到版本。唯一保证的值为new_v,始终为10; outputoutput2都可以是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的诀窍也有效,但它看起来更像是对我的黑客攻击。无论如何,您无法避免tf.control_dependencies