Функция torch.scatter_add в PyTorch


Pytorch torch 参考手册Справочное руководство PyTorch torch

torch.scatter_add— это функция в PyTorch, используемая для добавления значений исходного тензора в указанные позиции. Она будетsrcзначения в соответствии сindexуказанные позиции, в которые нужно добавитьinputв.

Определение функции

torch.scatter_add(input, dim, index, src)

Parameters:

  • input(Tensor): входной тензор.
  • dim(int): Измерение для разбрасывания.
  • index(Tensor): Тензор индексов, указывающий, куда добавлять значения src в input.
  • src(Tensor): Исходный тензор, значения для добавления.

Возвращаемое значение:

  • torch.Tensor: Возвращает изменённый тензор.

Пример использования

Пример

import torch

# Создать входной тензор
input = torch.zeros(3, 5)

# Создать index и source
index = torch.tensor([[0, 1, 2, 0, 0],
                      [1, 2, 0, 1, 2],
                      [2, 0, 1, 2, 0]])
src = torch.tensor([[1, 1, 1, 1, 1],
                    [2, 2, 2, 2, 2],
                    [3, 3, 3, 3, 3]])

# Разбросать и накопить вдоль dim=0
output = torch.scatter_add(input, dim=0, index=index, src=src)

print("Вход:")
print(input)
print("nIndex:")
print(index)
print("nSource:")
print(src)
print("nРезультат:")
print(output)

Результат вывода:

输入:
tensor([[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]])

索引:
tensor([[0, 1, 2, 0, 0],
        [1, 2, 0, 1, 2],
        [2, 0, 1, 2, 0]])

源:
tensor([[1., 1., 1., 1., 1.],
        [2., 2., 2., 2., 2.],
        [3., 3., 3., 3., 3.]])

结果:
tensor([[4., 1., 2., 4., 4.],
        [2., 1., 2., 2., 2.],
        [3., 3., 1., 3., 3.]])

Пример

import torch

# Использовать dim=1
input = torch.zeros(3, 5)
index = torch.tensor([[0, 1, 2, 1, 0],
                      [1, 2, 0, 2, 1],
                      [0, 1, 1, 0, 2]])
src = torch.arange(1, 6).float()

output = torch.scatter_add(input, dim=1, index=index, src=src)

print("Scatter вдоль dim=1:")
print(output)

Результат вывода:

沿 dim=1 散布:
tensor([[ 6.,  3.,  3.,  0.,  0.],
        [ 3.,  6.,  3.,  0.,  0.],
        [ 2.,  4.,  5.,  0.,  0.]])

Пример

import torch

# Сценарий применения для агрегирования значений из нескольких позиций
# Например, накопление признаков соседних узлов в графовых нейронных сетях

# Смоделировать начальные признаки 4 узлов
node_features = torch.zeros(4, 3)

# Смоделировать связи рёбер (исходные узлы указывают на целевые узлы)
edge_index = torch.tensor([0, 1, 2, 3, 0, 1])  # Исходные узлы рёбер
edge_weights = torch.tensor([1.0, 2.0, 3.0, 1.5, 2.5, 0.5])

# Создать взвешенные значения признаков узлов-источников для каждого ребра
src_features = torch.randn(6, 3) * edge_weights.unsqueeze(1)

# Накопить признаки в целевых узлах (здесь упрощено; на практике это должно основываться на целевых узлах рёбер)
target_nodes = torch.tensor([0, 0, 1, 1, 2, 3])
index = target_nodes

output = torch.scatter_add(node_features, 0, index.unsqueeze(1).expand_as(src_features), src_features)

print("Форма признаков узла:", node_features.shape)
print("Накопленные признаки:", output)

Примечание:torch.scatter_addне изменяет исходный входной тензор, а возвращает новый тензор. Несколько индексов могут указывать на одну и ту же позицию, и значения будут накапливаться. Эта функцияtorch.gatherобратная операция для.


Pytorch torch 参考手册Справочное руководство PyTorch torch

Другие расширения