tf.map_fn
| Просмотреть исходный код на GitHub |
Применяет функцию ко всем элементам списка тензоров, распакованных из elems по размерности 0.
tf.map_fn(
fn, elems, dtype=None, parallel_iterations=None, back_prop=True,
swap_memory=False, infer_shape=True, name=None
)
Самая простая версия map_fn последовательно применяет вызываемую функцию fn к последовательности элементов от первого до последнего. Элементы представляют собой тензоры, распакованные из elems. Тип данных возвращаемого значения fn — dtype. Пользователи должны предоставить dtype, если он отличается от типа данных elems.
Предположим, что elems распаковывается в values, список тензоров. Форма результирующего тензора — [values.shape[0]] + fn(values[0]).shape.
Этот метод также позволяет использовать многоаргументные elems и вывод fn. Если elems представляет собой (возможно, вложенный) список или кортеж тензоров, то каждый из этих тензоров должен иметь соответствующую первую (распаковываемую) размерность. Подпись fn может соответствовать структуре elems. То есть, если elems равно (t1, [t2, t3, [t4, t5]]), то соответствующая подпись для fn имеет вид: fn = lambda (t1, [t2, t3, [t4, t5]]):.
Кроме того, fn может генерировать структуру, отличную от входной. Например, fn может выглядеть так: fn = lambda t1: return (t1 + 1, t1 - 1). В этом случае параметр dtype не является необязательным: dtype должен быть типом или (возможно, вложенным) кортежем типов, соответствующим выводу fn.
Для применения функциональной операции к ненулевым элементам SparseTensor рекомендуется использовать один из следующих методов. Во-первых, если функция выражается через TensorFlow-операции, используйте
result = SparseTensor(input.indices, fn(input.values), input.dense_shape)
Если же функция не выражается через TensorFlow-операцию, используйте
result = SparseTensor( input.indices, map_fn(fn, input.values), input.dense_shape)
вместо этого.
При выполнении с помощью eager execution, map_fn не выполняется параллельно, даже если parallel_iterations установлено в значение > 1. Вы по-прежнему можете получить преимущества от параллельного выполнения функции, используя декоратор tf.contrib.eager.defun,
# Assume the function being used in map_fn is fn. # To ensure map_fn calls fn in parallel, use the defun decorator. @tf.contrib.eager.defun def func(tensor): return tf.map_fn(fn, tensor)
Обратите внимание, что при использовании декоратора defun любой не относящийся к TensorFlow Python-код, написанный в вашей функции, не будет выполнен. Подробнее см. tf.contrib.eager.defun. Рекомендуется отлаживать без defun, но переключиться на defun, чтобы получить преимущества от параллельного выполнения map_fn.
| Аргументы | |
|---|---|
fn | Вызываемая функция. Она принимает один аргумент, который имеет такую же (возможно, вложенную) структуру, как elems. Ее вывод должен иметь такую же структуру, как dtype, если она указана, в противном случае — такую же, как elems. |
elems | Тензор или (возможно, вложенная) последовательность тензоров, каждый из которых будет распакован по первой размерности. Вложенная последовательность результирующих слайсов будет применена к fn. |
dtype | (необязательно) Тип(ы) вывода fn. Если fn возвращает структуру тензоров, отличающуюся от структуры elems, то dtype не является необязательным и должна иметь такую же структуру, как вывод fn. |
parallel_iterations | (необязательно) Количество итераций, разрешенных для параллельного выполнения. При построении графа значение по умолчанию равно 10. При выполнении eager execution значение по умолчанию равно 1. |
back_prop | (необязательно) True включает поддержку обратного распространения. |
swap_memory | (необязательно) True включает обмен данными между GPU и CPU. |
infer_shape | (необязательно) False отключает проверки на согласованность форм вывода. |
name | (необязательно) Префикс имени для возвращаемых тензоров. |
| Возвращаемое значение | |
|---|---|
Тензор или (возможно, вложенная) последовательность тензоров. Каждый тензор упаковывает результаты применения fn к тензорам, распакованным из elems по первой размерности, от первого к последнему. |
| Исключения | |
|---|---|
TypeError | если fn не является вызываемой функцией, или структура вывода fn и dtype не совпадают, или если elems — SparseTensor. |
ValueError | если длины вывода fn и dtype не совпадают. |
Примеры:
elems = np.array([1, 2, 3, 4, 5, 6]) squares = map_fn(lambda x: x * x, elems) # squares == [1, 4, 9, 16, 25, 36]
elems = (np.array([1, 2, 3]), np.array([-1, 1, -1])) alternate = map_fn(lambda x: x[0] * x[1], elems, dtype=tf.int64) # alternate == [-1, 2, -3]
elems = np.array([1, 2, 3]) alternates = map_fn(lambda x: (x, -x), elems, dtype=(tf.int64, tf.int64)) # alternates[0] == [1, 2, 3] # alternates[1] == [-1, -2, -3]
© 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/r1.15/api_docs/python/tf/map_fn