tf.vectorized_map
Параллельное применение функции к списку тензоров, распакованных из elems по размерности 0.
tf.vectorized_map(
fn, elems, fallback_to_while_loop=True, warn=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. Обратите внимание, что откаты могут привести к замедлению, поскольку векторизация часто обеспечивает ускорение в один-два порядка величины. |
warn | Если установлено в false, это подавляет любые предупреждения из-за преобразований операций в предоставленном fn, возвращающихся к циклам while. |
| Возвращаемое значение | |
|---|---|
| Тензор или (возможно, вложенная) последовательность тензоров. Каждый тензор упаковывает результаты применения fn к тензорам, распакованным из elems по первой размерности, от первого к последнему. Хотя они встречаются реже в качестве входных и выходных данных, видимых пользователю, обратите внимание, что тензоры типа |
| Исключения | |
|---|---|
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