如何使用布尔张量制作if语句?更确切地说,我试图将大小为1的张量与常数进行比较,检查张量中的值是否小于常量。我想我必须使常量自己的大小为1张量,并使用this方法来检查第一张量是否小于第二张量,但我不确定如何产生最终的布尔张量正确地适合if语句。只需将其作为if语句的查询,使if语句始终返回true。
编辑:这或多或少是代码的样子。但是,无论是否有参数,我都会收到错误'bool' object has no attribute 'name'
,这让我觉得问题在于它没有返回TensorFlow对象。
pred = tf.placeholder(tf.bool)
def if_true(x, y, z):
#act on x, y, and z
return True
def if_false():
return False
# Will be `tf.cond()` in the next release.
from tensorflow.python.ops import control_flow_ops
from functools import partial
x = ...
y = ...
z = ...
result = control_flow_ops.cond(pred, partial(if_true, x, y, z), if_false)
答案 0 :(得分:24)
TL; DR:您需要使用Session.run()
来获取Python布尔值,但还有其他方法可以实现可能更高效的相同结果。
看起来你已经想出如何从你的价值中得到一个布尔张量,但为了其他读者的利益,它看起来像这样:
if
下一部分是如何将其用作条件。最简单的方法是使用Python pred
语句,但要做到这一点,您必须使用Session.run()
评估张量sess = tf.Session()
if sess.run(pred):
# Do something.
else:
# Do something else.
:
if
关于使用Python pred
语句的一个警告是,您必须将整个表达式计算到pred = tf.placeholder(tf.bool) # Can be any computed boolean expression.
val_if_true = tf.constant(28.0)
val_if_false = tf.constant(12.0)
result = tf.select(pred, val_if_true, val_if_false)
sess = tf.Session()
sess.run(result, feed_dict={pred: True}) # ==> 28.0
sess.run(result, feed_dict={pred: False}) # ==> 12.0
,这使得重用已经计算过的中间值变得棘手。我想提请您注意另外两种使用TensorFlow计算条件表达式的方法,这些方法不需要您评估谓词并获取Python值。
第一种方法使用tf.select()
op有条件地传递来自作为参数传递的两个张量的值:
tf.select()
tf.select()
op在其所有参数上以元素方式工作,这允许您组合来自两个输入张量的值。有关详细信息,请参阅its documentation。 val_if_true
的缺点是它在计算结果之前评估val_if_false
和# Define some large matrices
a = ...
b = ...
c = ...
pred = tf.placeholder(tf.bool)
def if_true():
return tf.matmul(a, b)
def if_false():
return tf.matmul(b, c)
# Will be `tf.cond()` in the next release.
from tensorflow.python.ops import control_flow_ops
result = tf.cond(pred, if_true, if_false)
sess = tf.Session()
sess.run(result, feed_dict={pred: True}) # ==> executes only (a x b)
sess.run(result, feed_dict={pred: False}) # ==> executes only (b x c)
,如果它们是复杂的表达式,可能会很昂贵。
第二种方式使用tf.cond()
op,它有条件地评估两个表达式中的一个。如果表达式很昂贵,这一点特别有用,如果它们have side effects则必不可少。基本模式是指定两个Python函数(或lambda表达式)来构建将在true或false分支上执行的子图:
Welcome to Racket v6.4.0.4.
-> (version)
"6.4.0.4"
答案 1 :(得分:1)
使用reshape(t, [])
获取值并在if语句中使用它