PyTorch torch.scatter_add-Funktion
PyTorch torch-Referenzhandbuch
torch.scatter_addist eine Funktion in PyTorch, die verwendet wird, um die Werte des Quelltensors zu den angegebenen Positionen zu addieren. Sie wirdsrcdie Werte gemäßindexdie angegebenen Positionen, zu denen hinzugefügt werden sollinputin.
Funktionsdefinition
torch.scatter_add(input, dim, index, src)
Parameters:
input(Tensor): Eingabe-Tensor.dim(int): Die Dimension, entlang der gestreut wird.index(Tensor): Index-Tensor, der angibt, wo die Werte von src zu input addiert werden.src(Tensor): Quelltensor, die zu addierenden Werte.
Rückgabewert:
torch.Tensor: Gibt den geänderten Tensor zurück.
Anwendungsbeispiel
Beispiel
import torch
# Eingabe-Tensor erstellen
input = torch.zeros(3, 5)
# Index und source erstellen
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]])
# Streuen und akkumulieren entlang dim=0
output = torch.scatter_add(input, dim=0, index=index, src=src)
print("Eingabe:")
print(input)
print("nIndex:")
print(index)
print("nSource:")
print(src)
print("nErgebnis:")
print(output)
# Eingabe-Tensor erstellen
input = torch.zeros(3, 5)
# Index und source erstellen
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]])
# Streuen und akkumulieren entlang dim=0
output = torch.scatter_add(input, dim=0, index=index, src=src)
print("Eingabe:")
print(input)
print("nIndex:")
print(index)
print("nSource:")
print(src)
print("nErgebnis:")
print(output)
Das Ausgabeergebnis ist:
输入:
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.]])
Beispiel
import torch
# dim=1 verwenden
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 entlang dim=1:")
print(output)
# dim=1 verwenden
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 entlang dim=1:")
print(output)
Das Ausgabeergebnis ist:
沿 dim=1 散布:
tensor([[ 6., 3., 3., 0., 0.],
[ 3., 6., 3., 0., 0.],
[ 2., 4., 5., 0., 0.]])
Beispiel
import torch
# Anwendungsszenario zum Aggregieren von Werten aus mehreren Positionen
# Zum Beispiel das Akkumulieren von Merkmalen benachbarter Knoten in Graph-Neuronalen Netzen
# Simuliere initiale Merkmale von 4 Knoten
node_features = torch.zeros(4, 3)
# Simuliere Kantenverbindungen (Quellknoten zeigen auf Zielknoten)
edge_index = torch.tensor([0, 1, 2, 3, 0, 1]) # Quellknoten der Kanten
edge_weights = torch.tensor([1.0, 2.0, 3.0, 1.5, 2.5, 0.5])
# Gewichtete Werte der Quellknotenmerkmale für jede Kante erstellen
src_features = torch.randn(6, 3) * edge_weights.unsqueeze(1)
# Die Merkmale zu den Zielknoten akkumulieren (hier vereinfacht; in der Praxis sollte es auf den Zielknoten der Kanten basieren)
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("Form der Knotenmerkmale:", node_features.shape)
print("Akkumulierte Merkmale:", output)
# Anwendungsszenario zum Aggregieren von Werten aus mehreren Positionen
# Zum Beispiel das Akkumulieren von Merkmalen benachbarter Knoten in Graph-Neuronalen Netzen
# Simuliere initiale Merkmale von 4 Knoten
node_features = torch.zeros(4, 3)
# Simuliere Kantenverbindungen (Quellknoten zeigen auf Zielknoten)
edge_index = torch.tensor([0, 1, 2, 3, 0, 1]) # Quellknoten der Kanten
edge_weights = torch.tensor([1.0, 2.0, 3.0, 1.5, 2.5, 0.5])
# Gewichtete Werte der Quellknotenmerkmale für jede Kante erstellen
src_features = torch.randn(6, 3) * edge_weights.unsqueeze(1)
# Die Merkmale zu den Zielknoten akkumulieren (hier vereinfacht; in der Praxis sollte es auf den Zielknoten der Kanten basieren)
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("Form der Knotenmerkmale:", node_features.shape)
print("Akkumulierte Merkmale:", output)
Hinweis:torch.scatter_addändert den ursprünglichen Eingabe-Tensor nicht, sondern gibt einen neuen Tensor zurück. Mehrere Indizes können auf dieselbe Position zeigen, und die Werte werden akkumuliert. Diese Funktion isttorch.gatherdie inverse Operation von.
Andere Erweiterungen