tf.cond
Возвращает true_fn(), если предикат pred истинен, иначе возвращает false_fn().
tf.cond(
pred, true_fn=None, false_fn=None, name=None
)
Используется в блокнотах
| Используется в руководстве | Используется в учебных пособиях |
|---|---|
Примечание: Эта операция автоматически используется вtf.functionдля преобразования инструкций if в Python, когда предикат являетсяtf.Tensor, если толькоautograph=Falseявно не указано в аргументахtf.function. Например, следующие фрагменты эквивалентны:
@tf.function
def fun1(x,y):
if x > 0: # AutoGraph converts if-statement to tf.cond().
z = y+1
else:
z = y-1
return z
fun1(tf.constant(7), tf.constant(3)).numpy()
4@tf.function def fun2(x,y): pred = x > 0 true_fn = lambda: y+1 false_fn = lambda: y-1 return tf.cond(pred, true_fn, false_fn) # Use tf.cond() explicitly. fun1(tf.constant(7), tf.constant(3)).numpy() 4
Дополнительные сведения см. в руководстве по tf.function и AutoGraph.
true_fn и false_fn возвращают списки выходных тензоров. true_fn и false_fn должны возвращать одинаковое ненулевое количество выходных значений одного типа.
Хотя такое поведение соответствует модели потока данных TensorFlow, оно часто удивляло пользователей, ожидавших более ленивой семантики. Рассмотрим следующую простую программу:
x, y = tf.constant(2, dtype=tf.int32), tf.constant(4, dtype=tf.int32) z = tf.multiply(x, y) r = tf.cond(x < y, lambda: tf.add(x, z), lambda: tf.square(y)) r.numpy() 10
Если x < y, операция tf.add будет выполнена, а операция tf.square — нет. Поскольку z требуется как минимум для одной ветви cond, операция tf.multiply выполняется всегда, безусловно.
Обратите внимание, что cond вызывает true_fn и false_fn ровно один раз (внутри вызова cond и ни разу во время Session.run()). cond объединяет фрагменты графа, созданные во время вызовов true_fn и false_fn, с некоторыми дополнительными узлами графа, чтобы обеспечить выполнение нужной ветви в зависимости от значения pred.
tf.cond поддерживает вложенные структуры, реализованные в tensorflow.python.util.nest. И true_fn, и false_fn должны возвращать одинаковую (возможно, вложенную) структуру значений из списков, кортежей и/или именованных кортежей. Единственное исключение — одноэлементные списки и кортежи: при возврате из true_fn и/или false_fn они автоматически распаковываются в отдельные значения.
Примечание: Запрещено напрямую использовать тензоры, созданные внутри ветви cond, за её пределами, например сохраняя ссылку на тензор ветви в состоянии Python. Если вам нужно использовать тензор, созданный в функции ветви, верните его как выходное значение этой функции и используйте выходное значение из tf.cond.
| Аргументы | |
|---|---|
pred | Скаляр, определяющий, возвращать ли результат true_fn или false_fn. |
true_fn | Вызываемый объект, который будет выполнен, если pred истинен. |
false_fn | Вызываемый объект, который будет выполнен, если pred ложен. |
name | Необязательный префикс имени для возвращаемых тензоров. |
| Возвращает | |
|---|---|
Тензоры, возвращённые вызовом true_fn или false_fn. Если вызываемый объект возвращает одноэлементный список, его элемент извлекается из списка. |
| Вызывает исключения | |
|---|---|
TypeError | если true_fn или false_fn не является вызываемым объектом. |
ValueError | если true_fn и false_fn возвращают разное количество тензоров или тензоры разных типов. |
Пример:
x = tf.constant(2) y = tf.constant(5) def f1(): return tf.multiply(x, 7) def f2(): return tf.add(y, 3) r = tf.cond(tf.less(x, y), f1, f2) # r is set to f1(). # Operations in f2 (e.g., tf.add) are not executed. r.numpy() 14
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/cond