【问题标题】:How to understand using tf.cond with tf.Print?如何理解将 tf.cond 与 tf.Print 结合使用?
【发布时间】:2017-12-12 17:58:57
【问题描述】:

看代码:

import tensorflow as tf

x = tf.constant(1.0)
y = tf.constant(2.0)
z = tf.constant(3.0)
def f1():
    return tf.Print(x, [x])

def f2():
    return tf.Print(z, [z])
op = tf.cond(x>y, f1, f2)
with tf.Session() as sess:
    sess.run(op)

我很疑惑,tf.Print的输出是3.0

我们知道,tf.Print(z, [z]) 只有在评估z 时才会输出z 的值,但我认为我没有评估z

另一个问题是关于tf.cond,它是如何将节点添加到图形中的,例如如何将tf.Print添加到图形中,我认为它应该将一些张量与tf.Print的返回相关联,否则tf.Print赢了'不会被执行。

我很困惑。

【问题讨论】:

  • tf.Print 操作的张量输出等于它的输入。所以tf.Print(x, [y1, y2, ...]) 将评估为x,但有打印[y1, y2, ...] 值的副作用。这是否开始回答您的问题?

标签: tensorflow


【解决方案1】:

我认为您可能对tf.cond 的参数顺序感到困惑。来电:

tf.cond(predicate, f, g)

相当于“如果predicate为真则评估f,否则评估g

在您的示例中,由于您的谓词 x > y 为假,因此评估了 f2


注意

由于 tensorflow 1.4,tf.cond 将接受关键字参数 true_fnfalse_fn,因此您可以通过编写避免任何混淆:

tf.cond(predicate, true_fn=f, false_fn=g)

# Or equivalently...
tf.cond(predicate, false_fn=g, true_fn=f)

【讨论】:

  • 我的 true_fn 或 false_fn 返回 tf.Print,我对需要评估张量的 tf.Print 感到困惑,但我不评估张量。你可能误解了我的问题。
  • 也许我有。我以为你的困惑是关于看到 z 而不是 x 的价值,但在第二次阅读时,我发现它更多地是关于 tf.Print 的性质。
  • 是的,tf.Printtf.identity 一样工作,所以我可以将f2 重写为def f2(): z=tf.Print(z, [z]) return z,所以当它执行f2 时等于执行z,而tf.Print(z,[z]) 将输出z的值,我只是在满足条件时使用它来调试。
猜你喜欢
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
相关资源
最近更新 更多