Función PyTorch torch.scatter_reduce
Manual de referencia de Pytorch torch
torch.scatter_reduceEs una función de PyTorch que se utiliza para agregar los valores de un tensor fuente a posiciones especificadas de la manera indicada. Admite múltiples modos de agregación, como suma, producto, máximo, mínimo, etc.
Definición de la función
torch.scatter_reduce(input, dim, index, src, reduce='sum', *, include_self=True)
Parámetros:
input(Tensor): el tensor de entrada.dim(int): la dimensión de agregación.index(Tensor): el tensor de índices, que especifica en qué posiciones de input se deben agregar los valores de src.src(Tensor): el tensor fuente, los valores a agregar.reduce(str): el modo de agregación, los valores opcionales son 'sum', 'prod', 'mean', 'amax', 'amin', 'multiply'. El valor predeterminado es 'sum'.include_self(bool, opcional): si se incluye el valor original de la propia posición del índice en la agregación. El valor predeterminado es True.
Valor de retorno:
torch.Tensor: Devuelve el tensor resultante de la agregación.
Ejemplo de uso
Ejemplo
# Crear el tensor de entrada
input = torch.ones(3, 5)
# Crear los índices y la 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]])
# Usar agregación con sum
output = torch.scatter_reduce(input, dim=0, index=index, src=src, reduce='sum')
print(Entrada:)
print(input)
print(nModo de agregación: sum)
print(Resultado:)
print(output)
El resultado de salida es:
输入:
tensor([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
聚合方式: sum
结果:
tensor([[4., 2., 3., 4., 4.],
[2., 2., 2., 2., 2.],
[3., 3., 2., 3., 3.]])
Ejemplo
# Probar diferentes modos de agregación
input = torch.zeros(3, 3)
index = torch.tensor([[0, 0, 0],
[1, 1, 1],
[2, 2, 2]])
src = torch.tensor([[2, 3, 4],
[5, 6, 7],
[8, 9, 10]])
# Usar prod (producto)
output_prod = torch.scatter_reduce(input, 0, index, src, reduce='prod')
print(Agregación con prod:)
print(output_prod)
# Usar amax (máximo)
output_max = torch.scatter_reduce(input, 0, index, src, reduce='amax')
print(nAgregación con amax:)
print(output_max)
# Usar amin (mínimo)
output_min = torch.scatter_reduce(input, 0, index, src, reduce='amin')
print(nAgregación con amin:)
print(output_min)
El resultado de salida es:
prod 聚合:
tensor([[ 2., 3., 4.],
[ 5., 6., 7.],
[ 8., 9., 10.]])
amax 聚合:
tensor([[ 2., 3., 4.],
[ 5., 6., 7.],
[ 8., 9., 10.]])
amin 聚合:
tensor([[ 2., 3., 4.],
[ 5., 6., 7.],
[ 8., 9., 10.]])
Ejemplo
# Usar el parámetro include_self
input = torch.tensor([1.0, 2.0, 3.0])
index = torch.tensor([0, 0, 0])
src = torch.tensor([10.0, 20.0, 30.0])
# Incluir el valor propio (por defecto)
output1 = torch.scatter_reduce(input, 0, index, src, reduce='sum', include_self=True)
print("include_self=True:", output1)
# No incluir el valor propio
output2 = torch.scatter_reduce(input, 0, index, src, reduce='sum', include_self=False)
print("include_self=False:", output2)
El resultado de salida es:
include_self=True: tensor([66., 2., 3.]) include_self=False: tensor([60., 2., 3.])
Nota:torch.scatter_reduceNo modifica el tensor de entrada original, sino que devuelve un nuevo tensor. Varios índices pueden apuntar a la misma posición, y los valores se agregarán según el modo de agregación especificado.include_self=FalseEs muy útil en ciertos escenarios, como en redes neuronales de grafos para evitar recalcular repetidamente las características del propio nodo.
Otras extensiones