如何使用布尔张量制作if语句?更确切地说,我试图将大小为1的张量与常数进行比较,检查张量中的值是否小于常量.我想我必须使常量自己的大小为1张量,并使用此方法检查第一张量是否小于第二张量,但我不确定如何使得到的布尔张量正确拟合到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)
Run Code Online (Sandbox Code Playgroud)
mrr*_*rry 24
TL; DR:您需要使用Session.run()获取Python布尔值,但还有其他方法可以实现可能更高效的相同结果.
看起来你已经想出如何从你的价值中得到一个布尔张量,但为了其他读者的利益,它看起来像这样:
computed_val = ...
constant_val = tf.constant(37.0)
pred = tf.less(computed_val, constant_val) # N.B. Types of the two args must match
Run Code Online (Sandbox Code Playgroud)
接下来的部分是如何将其用作条件.最简单的方法是使用Python if语句,但要做到这一点,你必须使用以下方法评估张量:predSession.run()
sess = tf.Session()
if sess.run(pred):
# Do something.
else:
# Do something else.
Run Code Online (Sandbox Code Playgroud)
关于使用Python if语句的一个警告是,您必须评估整个表达式pred,这使得重用已经计算过的中间值变得棘手.我想提醒您注意使用TensorFlow计算条件表达式的另外两种方法,它们不需要您评估谓词并获取Python值.
第一种方法使用tf.select()op有条件地传递来自作为参数传递的两个张量的值:
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
Run Code Online (Sandbox Code Playgroud)
该tf.select()运算工作逐元素的所有它的参数,它允许您从值两个输入张量相结合.有关详细信息,请参阅其文档.缺点tf.select()是它在计算结果时val_if_true和val_if_false计算结果之前进行评估,如果它们是复杂的表达式则可能是昂贵的.
第二种方式使用tf.cond()op,它有条件地评估两个表达式中的一个.如果表达式很昂贵,这是特别有用的,如果它们有副作用,这是必不可少的.基本模式是指定两个Python函数(或lambda表达式)来构建将在true或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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33467 次 |
| 最近记录: |