Spec-Zone.ru › TensorFlow

tf.numpy_function

Оборачивает функцию Python и использует ее как операцию TensorFlow.

Просмотреть псевдонимы

Псевдонимы совместимости для миграции

Подробнее см. в руководстве по миграции.

tf.compat.v1.numpy_function

tf.numpy_function(
    func=None, inp=None, Tout=None, stateful=True, name=None
)

Используется в блокнотах

Используется в руководствах
  • Игра в CartPole методом Actor-Critic

Если задана функция 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 (Необязательно) Имя операции.
Возвращает
  • Если func — это None, возвращается декоратор, который гарантирует, что декорированная функция всегда будет выполняться в eager-режиме, даже при вызове из tf.function/tf.Graph.
  • Если используется func, отличное от None, функция func выполняется в eager-режиме и возвращает результат: один объект tf.Tensor или их список, вычисленный функцией func.

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API