Spec-Zone.ru › TensorFlow

tf.vectorized_map

Параллельное применение функции к списку тензоров, распакованных из elems по размерности 0.

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

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

См. Руководство по миграции для получения более подробной информации.

tf.compat.v1.vectorized_map

tf.vectorized_map(
    fn, elems, fallback_to_while_loop=True, warn=True
)

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

Используется в руководстве
  • NumPy API в TensorFlow

Этот метод работает аналогично методу tf.map_fn, но оптимизирован для значительно большей скорости, возможно, с гораздо большим объёмом занимаемой памяти. Ускорение достигается за счёт векторизации (см. Автоматическая векторизация графиков TensorFlow: Якобианы, автоматическое пакетное выполнение и не только). Идея векторизации заключается в семантическом параллельном запуске всех вызовов fn и слиянии соответствующих операций по всем этим вызовам. Это слияние выполняется статически во время генерации графика, и полученный код часто демонстрирует производительность, сопоставимую с вручную объединённой версией.

Поскольку tf.vectorized_map полностью паралелизует пакет, этот метод, как правило, будет значительно быстрее, чем использование tf.map_fn, особенно в режиме eager. Однако это экспериментальная функция, и в настоящее время она имеет много ограничений:

  • Между различными семантическими вызовами fn не должно быть зависимости данных, то есть должно быть безопасно сопоставлять элементы входных данных в любом порядке.
  • Состоятельные ядра могут в основном не поддерживаться, поскольку они часто подразумевают зависимость данных. Тем не менее, мы поддерживаем ограниченный набор таких состоятельных ядер (например, RandomFoo, операции с переменными, такие как чтение и т. д.).
  • fn имеет ограниченную поддержку операций управления потоком.
  • fn должен возвращать вложенную структуру тензоров или операций. Однако если возвращается операция, у неё должно быть нулевое количество выходов.
  • Форма и тип данных любых промежуточных или выходных тензоров в вычислении fn не должны зависеть от входных данных для fn.

Примеры:

def outer_product(a):
  return tf.tensordot(a, a, 0)

batch_size = 100
a = tf.ones((batch_size, 32, 32))
c = tf.vectorized_map(outer_product, a)
assert c.shape == (batch_size, 32, 32, 32, 32)
# Computing per-example gradients

batch_size = 10
num_features = 32
layer = tf.keras.layers.Dense(1)

def model_fn(arg):
  with tf.GradientTape() as g:
    inp, label = arg
    inp = tf.expand_dims(inp, 0)
    label = tf.expand_dims(label, 0)
    prediction = layer(inp)
    loss = tf.nn.l2_loss(label - prediction)
  return g.gradient(loss, (layer.kernel, layer.bias))

inputs = tf.random.uniform([batch_size, num_features])
labels = tf.random.uniform([batch_size, 1])
per_example_gradients = tf.vectorized_map(model_fn, (inputs, labels))
assert per_example_gradients[0].shape == (batch_size, num_features, 1)
assert per_example_gradients[1].shape == (batch_size, 1)
Аргументы
fn Выполняемая функция. Она принимает один аргумент, который будет иметь такую же (возможно, вложенную) структуру, как и elems, и возвращает, возможно, вложенную структуру тензоров и операций, которая может отличаться от структуры elems.
elems Тензор или (возможно, вложенная) последовательность тензоров, каждый из которых будет распакован вдоль своей первой размерности. Вложенная последовательность результирующих срезов будет обрабатываться fn. Первые размерности всех элементов должны быть согласованы; другими словами, каждый тензор элементов должен иметь первую размерность, равную либо B, либо 1, для некоторого общего размера пакета B >= 1.
fallback_to_while_loop Если истинно, при неудачной векторизации операции недопустимая операция оборачивается в tf.while_loop для выполнения итераций отображения. Обратите внимание, что этот откат происходит только для недопустимых операций, и другие части fn по-прежнему векторизованы. Если ложно, при обнаружении недопустимой операции выбрасывается ValueError. Обратите внимание, что откаты могут привести к замедлению, поскольку векторизация часто обеспечивает ускорение в один-два порядка величины.
warn Если установлено в false, это подавляет любые предупреждения из-за преобразований операций в предоставленном fn, возвращающихся к циклам while.
Возвращаемое значение
Тензор или (возможно, вложенная) последовательность тензоров. Каждый тензор упаковывает результаты применения fn к тензорам, распакованным из elems по первой размерности, от первого к последнему.

Хотя они встречаются реже в качестве входных и выходных данных, видимых пользователю, обратите внимание, что тензоры типа tf.variant, представляющие списки тензоров (например, из tf.raw_ops.TensorListFromTensor) векторизуются путём укладки содержимого списка, а не самого варианта, и поэтому возвращаемый контейнерный тензор будет иметь скалярную форму вместо обычной формы, полученной путём укладки. Это улучшает производительность векторизации градиентов потоков управления.

Исключения
ValueError Если векторизация завершается неудачно, а fallback_to_while_loop равно False.

© 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/vectorized_map

Spec-Zone.ru

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