tf.compat.v1.py_func
Оборачивает функцию Python и использует её как операцию TensorFlow.
tf.compat.v1.py_func(
func, inp, Tout, stateful=True, name=None
)
Миграция на TF2
Это имя устарело и удалено в TF2, но tf.numpy_function — это практически точная замена, просто удалите аргумент stateful (все вызовы tf.numpy_function считаются состоятельными). Она совместима с выполнением в режиме eager и tf.function.
tf.py_function — это близкая, но не точная замена, передающая тензоры TensorFlow в обернутую функцию вместо массивов NumPy, что обеспечивает вычисление градиентов и может использовать ускорители.
До:
def fn_using_numpy(x):
x[0] = 0.
return x
tf.compat.v1.py_func(fn_using_numpy, inp=[tf.constant([1., 2.])],
Tout=tf.float32, stateful=False)
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([0., 2.], dtype=float32)>
После:
tf.numpy_function(fn_using_numpy, inp=[tf.constant([1., 2.])],
Tout=tf.float32)
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([0., 2.], dtype=float32)>
Описание
Дана функция Python func, которая принимает массивы NumPy в качестве аргументов и возвращает массивы NumPy в качестве результатов, оберните эту функцию как операцию в графе TensorFlow. Следующий фрагмент создаёт простой граф TensorFlow, который вызывает функцию NumPy np.sinh() как операцию в графе:
def my_func(x): # x will be a numpy array with the contents of the placeholder below return np.sinh(x) input = tf.compat.v1.placeholder(tf.float32) y = tf.compat.v1.py_func(my_func, [input], tf.float32)
Примечание: У операции tf.compat.v1.py_func() есть следующие известные ограничения:
Тело функции (т. е.
func) не будет сериализовано вGraphDef. Поэтому не следует использовать эту функцию, если вам нужно сериализовать вашу модель и восстановить её в другой среде.Операция должна выполняться в том же адресном пространстве, что и программа Python, которая вызывает
tf.compat.v1.py_func(). Если вы используете распределённый TensorFlow, вы должны запуститьtf.distribute.Serverв том же процессе, что и программа, которая вызываетtf.compat.v1.py_func(), и вы должны привязать созданную операцию к устройству в этом сервере (например, с помощьюwith tf.device():).
Примечание: Она генерирует тензоры неизвестной формы и ранга, так как вывод формы не работает с произвольным кодом Python. Если вам нужна форма, вам нужно установить её на основе статически доступной информации.
Например:
import tensorflow as tf
import numpy as np
def make_synthetic_data(i):
return np.cast[np.uint8](i) * np.ones([20,256,256,3],
dtype=np.float32) / 10.
def preprocess_fn(i):
ones = tf.py_function(make_synthetic_data,[i],tf.float32)
ones.set_shape(tf.TensorShape([None, None, None, None]))
ones = tf.image.resize(ones, [224,224])
return ones
ds = tf.data.Dataset.range(10)
ds = ds.map(preprocess_fn)
| Аргументы | |
|---|---|
func | Функция Python, которая принимает объекты ndarray в качестве аргументов и возвращает список объектов ndarray (или один объект ndarray). Эта функция должна принимать столько аргументов, сколько тензоров в inp, и эти типы аргументов будут соответствовать соответствующим объектам tf.Tensor в inp. Возвращаемые ndarray должны соответствовать числу и типам, определённым Tout. Важное замечание: входные и выходные массивы NumPy ndarray функции func не гарантируют копирование. В некоторых случаях их основная память будет совмещена с соответствующими тензорами TensorFlow. Изменение на месте или хранение func входных или выходных значений в структурах данных Python без явного (np.)copy может иметь непредсказуемые последствия. |
inp | Список объектов Tensor |
Tout | Список или кортеж типов данных TensorFlow, или один тип данных TensorFlow, если их только один, указывающий, что возвращает func |
stateful | (Булево). Если True, функция должна рассматриваться как состоятельная. Если функция бессостоятельная, при одинаковом входе она будет возвращать тот же выход и не будет иметь наблюдаемых побочных эффектов. Оптимизации, такие как удаление общих подвыражений, выполняются только для бессостоятельных операций. |
name | Имя операции (необязательно). |
| Возвращаемые значения | |
|---|---|
Список Tensor или один 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/versions/r2.9/api_docs/python/tf/compat/v1/py_func