Función PyTorch torch.scatter_add


Pytorch torch 参考手册Manual de referencia de Pytorch torch

torch.scatter_addEs una función en PyTorch que se utiliza para sumar los valores del tensor fuente a las posiciones especificadas. Estasrcel valor de segúnindexlas posiciones especificadas añade ainputen.

Definición de la función

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

Parámetros:

  • input(Tensor): Tensor de entrada.
  • dim(int): Dimensión de dispersión.
  • index(Tensor): Tensor de índices, especifica en qué posición de input se deben sumar los valores de src.
  • src(Tensor): Tensor fuente, los valores a agregar.

Valor de retorno:

  • torch.Tensor: Devuelve el tensor modificado.

Ejemplo de uso

Ejemplo

import torch

# Crear tensor de entrada
input = torch.zeros(3, 5)

# Crear índices y fuente
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]])

# Dispersar y acumular a lo largo de dim=0
output = torch.scatter_add(input, dim=0, index=index, src=src)

print("Entrada:")
print(input)
print("nÍndice:")
print(index)
print("nFuente:")
print(src)
print("nResultado:")
print(output)

El resultado de salida es:

输入:
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.]])

Ejemplo

import torch

# Usando 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("Dispersión a lo largo de dim=1:")
print(output)

El resultado de salida es:

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

Ejemplo

import torch

# Escenario de aplicación para agregar valores de múltiples posiciones
# Por ejemplo, acumular características de nodos vecinos en redes neuronales de grafos

# Simular características iniciales de 4 nodos
node_features = torch.zeros(4, 3)

# Simular la relación de conexión de las aristas (el nodo fuente apunta al nodo destino)
edge_index = torch.tensor([0, 1, 2, 3, 0, 1])  # Nodo fuente de la arista
edge_weights = torch.tensor([1.0, 2.0, 3.0, 1.5, 2.5, 0.5])

# Crear valores ponderados de las características del nodo fuente para cada arista
src_features = torch.randn(6, 3) * edge_weights.unsqueeze(1)

# Acumular las características en el nodo destino (aquí se simplifica, en realidad se necesita según el nodo destino de la arista)
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("Forma de las características de los nodos:", node_features.shape)
print("Características acumuladas:", output)

Nota:torch.scatter_addNo modifica el tensor de entrada original, sino que devuelve un nuevo tensor. Múltiples índices pueden apuntar a la misma posición y los valores se acumulan. Esta función estorch.gatherla operación inversa de.


Pytorch torch 参考手册Manual de referencia de Pytorch torch

Otras extensiones