tf.cond与if-else有什么区别?
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))
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?他们之间有什么不同?
答案 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
。