Функция torch.scatter_add в PyTorch
Справочное руководство 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)
# Создать входной тензор
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
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)
# Сценарий применения для агрегирования значений из нескольких позиций
# Например, накопление признаков соседних узлов в графовых нейронных сетях
# Смоделировать начальные признаки 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обратная операция для.
Другие расширения