Spec-Zone.ru › TensorFlow 2.4

tf.vectorized_map

Просмотреть исходный код на GitHub

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

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

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

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

tf.compat.v1.vectorized_map

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

Этот метод работает аналогично tf.map_fn, но оптимизирован для значительно большей скорости, возможно, с большим объёмом используемой памяти. Ускорение достигается за счёт векторизации (см. Auto-Vectorizing TensorFlow Graphs: Jacobians, Auto-Batching and Beyond). Идея векторизации заключается в семантическом запуске всех вызовов 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 Если True, при невозможности векторизации операции, неподдерживаемая операция оборачивается в tf.while_loop для выполнения итераций карты. Обратите внимание, что этот вариант происходит только для неподдерживаемых операций, и другие части fn по-прежнему векторизуются. Если False, при обнаружении неподдерживаемой операции генерируется ValueError. Обратите внимание, что использование обходных путей может привести к замедлению, поскольку векторизация часто обеспечивает ускорение в один-два порядка величины.
Возвращаемое значение
Тензор или (возможно, вложенная) последовательность тензоров. Каждый тензор содержит результаты применения функции fn к тензорам, распакованным из elems по первой размерности, от первого до последнего.

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

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

© 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/r2.4/api_docs/python/tf/vectorized_map

Spec-Zone.ru

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