Spec-Zone.ru › TensorFlow 2.3

tf.scatter_nd

Разброс updates в новый тензор в соответствии с indices.

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

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

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

tf.compat.v1.manip.scatter_nd, tf.compat.v1.scatter_nd

tf.scatter_nd(
    indices, updates, shape, name=None
)

Создает новый тензор, применяя разреженный updates к отдельным значениям или срезам внутри тензора (изначально нулевой для числовых, пустой для строковых) заданного shape в соответствии с индексами. Этот оператор является обратным оператору tf.gather_nd, который извлекает значения или срезы из заданного тензора.

Этот оператор похож на tensor_scatter_add, за исключением того, что тензор инициализируется нулем. Вызов tf.scatter_nd(indices, values, shape) идентичен tensor_scatter_add(tf.zeros(shape, values.dtype), indices, values)

Если indices содержит дубликаты, то их обновления накапливаются (суммируются).

Предупреждение: Порядок применения обновлений не определен, поэтому вывод будет неопределенным, если indices содержит дубликаты — из-за некоторых проблем с численным приближением, числа, суммированные в разном порядке, могут давать разные результаты.

indices — это целочисленный тензор, содержащий индексы в новый тензор формы shape. Последнее измерение indices может быть не больше ранга shape:

indices.shape[-1] <= shape.rank

Последнее измерение indices соответствует индексам элементов (если indices.shape[-1] = shape.rank) или срезов (если indices.shape[-1] < shape.rank) вдоль измерения indices.shape[-1] из shape. updates — это тензор с формой

indices.shape[:-1] + shape[indices.shape[-1]:]

Простейший вид разброса — вставка отдельных элементов в тензор по индексу. Например, предположим, что мы хотим вставить 4 разбросанных элемента в тензор ранга 1 с 8 элементами.

В Python этот оператор разброса будет выглядеть так:

indices = tf.constant([[4], [3], [1], [7]])
updates = tf.constant([9, 10, 11, 12])
shape = tf.constant([8])
scatter = tf.scatter_nd(indices, updates, shape)
print(scatter)

Полученный тензор будет выглядеть так:

[0, 11, 0, 10, 9, 0, 0, 12]

Также мы можем вставить целые срезы тензора более высокого ранга сразу. Например, если мы хотели вставить два среза в первом измерении тензора ранга 3 с двумя матрицами новых значений.

В Python этот оператор разброса будет выглядеть так:

indices = tf.constant([[0], [2]])
updates = tf.constant([[[5, 5, 5, 5], [6, 6, 6, 6],
                        [7, 7, 7, 7], [8, 8, 8, 8]],
                       [[5, 5, 5, 5], [6, 6, 6, 6],
                        [7, 7, 7, 7], [8, 8, 8, 8]]])
shape = tf.constant([4, 4, 4])
scatter = tf.scatter_nd(indices, updates, shape)
print(scatter)

Полученный тензор будет выглядеть так:

[[[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]],
 [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
 [[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]],
 [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]

Обратите внимание, что на CPU, если обнаружен индекс за пределами границ, возвращается ошибка. На GPU, если обнаружен индекс за пределами границ, индекс игнорируется.

Аргументы
indices Тензор индексов. Должен быть одного из следующих типов: int32, int64.
updates Тензор обновлений.
shape Тензор формы. Должен иметь тот же тип, что и indices. 1-D.
name Имя операции (необязательно).
Возвращаемые значения
Результирующий тензор. Имеет тот же тип, что и updates.

© 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.3/api_docs/python/tf/scatter_nd

Spec-Zone.ru

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