Подтвердить что ты не робот

Как сделать оператор if с помощью булевого тензора

Как сделать оператор if с помощью булевого тензора? Точнее, я пытаюсь сравнить тензор размера 1 с константой, проверяя, меньше ли значение в тензоре константы. Я понял, что мне нужно сделать константу собственного тензора размера 1 и использовать этот метод, чтобы проверить, меньше ли первый тензор, чем второй тензор, но я не уверен, как сделать полученный логический тензор правильно вписывающимся в утверждение if. Просто включив его в запрос запроса if, оператор if всегда возвращает true.

EDIT: Это более или менее то, как выглядел код. Тем не менее, я получаю сообщение об ошибке '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)
4b9b3361

Ответ 1

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

Следующая часть состоит в том, как использовать его как условное. Самое простое - это использовать оператор Python if, но для этого нужно оценить тензор pred с помощью Session.run():

sess = tf.Session()

if sess.run(pred):
  # Do something.
else:
  # Do something else.

Одна оговорка об использовании инструкции 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

Оператор tf.select() работает по всем его аргументам, что позволяет комбинировать значения из двух входных тензоров. Подробнее см. его документацию. Недостатком tf.select() является то, что он вычисляет как val_if_true, так и val_if_false перед вычислением результата, который может быть дорогим, если они являются сложными выражениями.

Второй способ использует tf.cond() op, который условно оценивает одно из двух выражений. Это особенно полезно, если выражения дороги, и важно, чтобы они имели побочные эффекты. Основной шаблон состоит в том, чтобы указать две функции Python (или лямбда-выражения), которые строят подграфы, которые будут выполняться в истинных или ложных ветвях:

# 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)

Ответ 2

используйте reshape(t, []), чтобы получить значение и использовать его в вашем if-statement