Ответ 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)