tf.cond
| Просмотреть исходный код на GitHub |
Возвращает true_fn() если предикат pred истинен, иначе false_fn().
tf.cond(
pred, true_fn=None, false_fn=None, name=None
)
true_fn и false_fn оба возвращают списки выходных тензоров. true_fn и false_fn должны иметь одинаковое ненулевое количество и тип выходов.
Хотя это поведение соответствует модели потока данных TensorFlow, оно часто удивляет пользователей, ожидающих более леничной семантики. Рассмотрим следующую простую программу:
z = tf.multiply(a, b) result = tf.cond(x < y, lambda: tf.add(x, z), lambda: tf.square(y))
Если 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, 17) def f2(): return tf.add(y, 23) r = tf.cond(tf.less(x, y), f1, f2) # r is set to f1(). # Operations in f2 (e.g., tf.add) are not executed.
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.4/api_docs/python/tf/cond