Spec-Zone.ru › TensorFlow 2.9

tf.vectorized_map

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

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

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

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

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

tf.compat.v1.vectorized_map

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

Этот метод работает аналогично 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. Обратите внимание, что откаты могут привести к замедлению, поскольку векторизация часто обеспечивает ускорение на один или два порядка величины.
Возвращает
Тензор или (возможно, вложенная) последовательность тензоров. Каждый тензор упаковывает результаты применения 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/versions/r2.9/api_docs/python/tf/vectorized_map

Spec-Zone.ru

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