tf.numpy_function
Оборачивает функцию Python и использует ее как операцию TensorFlow.
tf.numpy_function(
func=None, inp=None, Tout=None, stateful=True, name=None
)
Используется в блокнотах
| Используется в руководствах |
|---|
Если задана функция Python func, оберните ее в операцию tf.function. func должна принимать массивы NumPy в качестве аргументов и возвращать массивы NumPy в качестве результатов.
Использовать tf.numpy_function можно двумя способами.
В качестве декоратора
При использовании tf.numpy_function в качестве декоратора:
- необходимо задать
Tout - можно задать
name - не следует задавать
funcилиinp
@tf.numpy_function(Tout=tf.float32)
def my_numpy_func(x):
# x will be a numpy array with the contents of the input to the
# tf.function
print(f'executing eagerly, {x=}')
return np.sinh(x)Функция выполняется в eager-режиме:
my_numpy_func(1.0).numpy() executing eagerly, x=1.0 1.17520
Поведение не меняется внутри tf.function:
@tf.function(input_signature=[tf.TensorSpec(None, tf.float32)]) def tf_function(input): y = tf.numpy_function(my_numpy_func, [input], tf.float32) return y tf_function(tf.constant(1.)).numpy() executing eagerly, x=array(1.) 1.17520
Вызов без декоратора
Этот вариант может быть полезен, если вы не контролируете исходный код функции, но его труднее читать.
Ниже приведена та же функция без декоратора:
def my_func(x):
# x will be a numpy array with the contents of the input to the
# tf.function
print(f'executing eagerly, {x=}')
return np.sinh(x)Чтобы вызвать tf.numpy_function напрямую, передайте функцию, ее входные данные и тип выходных данных одним вызовом tf.numpy_function:
tf.numpy_function(my_func, [tf.constant(1.0)], tf.float32) executing eagerly, x=array(1.) 1.17520
Подробнее
Сравнение с tf.py_function: tf.py_function и tf.numpy_function очень похожи, за исключением того, что tf.numpy_function принимает массивы NumPy, а не tf.Tensorы. Если функция должна содержать tf.Tensors, а все операции TensorFlow, выполняемые в функции, должны поддерживать дифференцирование, используйте tf.py_function.
Примечание: Из-за следующих известных ограничений не рекомендуется использовать tf.numpy_function за пределами прототипирования и экспериментов:
Вызов
tf.numpy_functionзахватывает глобальную блокировку интерпретатора Python (GIL), которая позволяет выполнять только один поток в каждый момент времени. Это препятствует эффективному распараллеливанию и распределению выполнения программы. Поэтому не рекомендуется использоватьtf.numpy_functionза пределами прототипирования и экспериментов.Тело функции (то есть
func) не будет сериализовано вtf.SavedModel. Поэтому не следует использовать эту функцию, если необходимо сериализовать модель и восстановить ее в другой среде.Операция должна выполняться в том же адресном пространстве, что и программа Python, вызывающая
tf.numpy_function(). При использовании распределенного TensorFlow необходимо запуститьtf.distribute.Serverв том же процессе, что и программа, вызывающаяtf.numpy_function, и закрепить созданную операцию за устройством на этом сервере (например, с помощьюwith tf.device():).В настоящее время
tf.numpy_functionнесовместима с XLA. Вызовtf.numpy_functionвнутриtf.function(jit_compile=True)приведет к ошибке.Поскольку функция принимает массивы NumPy, нельзя вычислить градиенты через numpy_function. Если вам нужна возможность дифференцирования, рассмотрите возможность использования tf.py_function.
| Аргументы | |
|---|---|
func | Функция Python, принимающая объекты numpy.ndarray в качестве аргументов и возвращающая список объектов numpy.ndarray (или один объект numpy.ndarray). Функция должна принимать столько аргументов, сколько тензоров содержится в inp; типы аргументов должны соответствовать типам объектов tf.Tensor в inp. Возвращаемые значения numpy.ndarray должны соответствовать количеству и типам, заданным в Tout. Важное замечание: входные и выходные numpy.ndarray функции func не гарантированно являются копиями. В некоторых случаях их базовая память будет совместно использоваться с соответствующими тензорами TensorFlow. Изменение на месте или сохранение входных либо возвращаемых значений func в структурах данных Python без явного вызова copy (np.copy) может привести к недетерминированным последствиям. |
inp | Список объектов tf.Tensor. |
Tout | Список или кортеж типов данных TensorFlow либо один тип данных TensorFlow, если он только один; указывает, что возвращает func. |
stateful | (Логическое значение.) Если задать для этого аргумента значение False, среда выполнения будет считать функцию не имеющей состояния, что позволяет применять некоторые оптимизации. Функция не имеет состояния, если при одинаковых входных данных она возвращает одинаковый результат и не имеет побочных эффектов; ее единственная цель — вернуть значение. Поведение функции с состоянием при значении False для аргумента stateful не определено. В частности, следует проявлять осторожность при изменении входных аргументов, поскольку это операция с состоянием. |
name | (Необязательно) Имя операции. |
| Возвращает | |
|---|---|
|
© 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/numpy_function