如何使用布尔Tensor创建if语句

Bee*_*eez 13 tensorflow

如何使用布尔张量制作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_trueval_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)