Función PyTorch torch.scatter_add
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)
# 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)
# 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)
# 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.
Otras extensiones