tf.cond和if-else有什么区别?

时间:2017-08-05 03:41:16

标签: tensorflow

tf.cond与if-else有什么区别?

场景1

import tensorflow as tf

x = 'x'
y = tf.cond(tf.equal(x, 'x'), lambda: 1, lambda: 0)
with tf.Session() as sess:
    print(sess.run(y))
x = 'y'
with tf.Session() as sess:
    print(sess.run(y))

场景2

import tensorflow as tf

x = tf.Variable('x')
y = tf.cond(tf.equal(x, 'x'), lambda: 1, lambda: 0)
init = tf.global_variables_initializer()
with tf.Session() as sess:
    init.run()
    print(sess.run(y))

tf.assign(x, 'y')
with tf.Session() as sess:
    init.run()
    print(sess.run(y))

输出均为1

这是否意味着只有tf.placeholder可以工作,而不是所有张量,例如tf.variable?我什么时候应该选择if-else条件以及何时使用tf.cond?他们之间有什么不同?

4 个答案:

答案 0 :(得分:26)

在运行时评估

tf.cond,而在图形构建时评估if-else

如果要根据运行时张量的值来评估条件,tf.cond是最佳选择。

答案 1 :(得分:1)

你的意思是if ... else在Python与tf.cond吗?

您可以使用if ... else为不同的外部条件创建不同的图表。例如,您可以为具有1, 2, 3隐藏层的图形创建一个python脚本,并使用命令行参数选择使用哪个。

tf.cond用于将条件块添加到图表中。例如,您可以通过以下代码定义Huber function

import tensorflow as tf
delta = tf.constant(1.)
x = tf.placeholder(tf.float32, shape=())

def left(x):
    return tf.multiply(x, x) / 2.
def right(x):
    return tf.multiply(delta, tf.abs(x) - delta / 2.)

hubber = tf.cond(tf.abs(x) <= delta,  lambda: left(x),  lambda: right(x))

并且Graph中的计算将针对不同的输入数据通过不同的分支。

sess = tf.Session()
with sess.as_default():
    sess.run(tf.global_variables_initializer())
    print(sess.run(hubber, feed_dict = {x: 0.5}))
    print(sess.run(hubber, feed_dict = {x: 1.0}))
    print(sess.run(hubber, feed_dict = {x: 2.0}))

> 0.125
> 0.5
> 1.5

答案 2 :(得分:0)

由于TensorFlow中的图形是静态的,因此一旦构建就无法修改它。因此,您可以随时在图形之外使用if-else,例如在准备批次等时,但您也可以在构建图形时使用它。也就是说,如果条件不依赖于任何张量的值,例如张量的尺寸(已经设定)或任何张量的形状。在这种情况下,由于条件在激励图形时不会改变图形。完成绘制图形后图形已得到修复,if-else条件在激活图形时不会影响图形。

但是如果条件取决于张量中的张量值,那么该条件应该包含在图中,因此应该应用tf.cond。

答案 3 :(得分:0)

简单地说:if else是如何切换 Python ,而tf.cond是你在 Tensorflow 中切换的方式。在运行期间,if else在已编译的 Python 程序中得到修复,而tf.cond在构造的 Tensorflow 图中得到修复。

您可以将tf.cond视为 Tensorflow 的内部执行方式if else