Dieses Paket besteht aus einer kleinen Erweiterungsbibliothek mit hochoptimierten Graphen -Cluster -Algorithmen für die Verwendung in Pytorch. Das Paket besteht aus den folgenden Clustering -Algorithmen:
Alle enthaltenen Operationen arbeiten zu unterschiedlichen Datentypen und werden sowohl für CPU als auch für GPU implementiert.
UPDATE: Sie können jetzt pytorch-cluster über Anaconda für alle wichtigen OS/Pytorch/CUDA-Kombinationen installieren? Da Sie pytorch >= 1.8.0 installiert haben, fahren Sie einfach aus.
conda install pytorch-cluster -c pyg
Wir stellen alternativ PIP -Räder für alle großen OS/Pytorch/CUDA -Kombinationen zur Verfügung, siehe hier.
Um die Binärdateien für Pytorch 2.5.0 zu installieren, laufen Sie einfach aus
pip install torch-cluster -f https://data.pyg.org/whl/torch-2.5.0+${CUDA}.html
wobei ${CUDA} je nach cpu , cu118 , cu121 oder cu124 abhängig von Ihrer Pytorch -Installation ersetzt werden sollte.
cpu | cu118 | cu121 | cu124 | |
|---|---|---|---|---|
| Linux | ✅ | ✅ | ✅ | ✅ |
| Fenster | ✅ | ✅ | ✅ | ✅ |
| macos | ✅ |
Um die Binärdateien für Pytorch 2.4.0 zu installieren, laufen Sie einfach aus
pip install torch-cluster -f https://data.pyg.org/whl/torch-2.4.0+${CUDA}.html
wobei ${CUDA} je nach cpu , cu118 , cu121 oder cu124 abhängig von Ihrer Pytorch -Installation ersetzt werden sollte.
cpu | cu118 | cu121 | cu124 | |
|---|---|---|---|---|
| Linux | ✅ | ✅ | ✅ | ✅ |
| Fenster | ✅ | ✅ | ✅ | ✅ |
| macos | ✅ |
HINWEIS: Binaries älterer Versionen werden auch für Pytorch 1.4.0, Pytorch 1.5.0, Pytorch 1.6.0, Pytorch 1.7.0/1.7.1, Pytorch 1.8.0/1.8.1, Pytorch 1.9.0, Pytorch 1.10/1.10/1.10, 1,10/1.10, 1,10/1.10/1.10.2, Pytorch 1.10/1.10/1.10.2, Pytorch 1.10/1.10/1.10.2, bereitgestellt. 1.12.0/1.12.1, Pytorch 1.13.0/1.13.1, Pytorch 2.0.0/2.0.1, Pytorch 2.1.0/2.1.1/2.1.2, Pytorch 2.2.0/2.2.1/2.2.2 und Pytorch 2.3.0/2.3.1 (nach dem gleichen Verfahren). Für ältere Versionen müssen Sie explizit die neueste unterstützte Versionsnummer oder die Installation über pip install --no-index angeben, um eine manuelle Installation aus der Quelle zu verhindern. Hier können Sie die neueste unterstützte Versionsnummer nachschlagen.
Stellen Sie sicher, dass mindestens Pytorch 1.4.0 installiert ist, und überprüfen Sie, ob sich cuda/bin und cuda/include in Ihrem $PATH bzw. $CPATH , befinden:
$ python -c "import torch; print(torch.__version__)"
>>> 1.4.0
$ python -c "import torch; print(torch.__version__)"
>>> 1.1.0
$ echo $PATH
>>> /usr/local/cuda/bin:...
$ echo $CPATH
>>> /usr/local/cuda/include:...
Dann rennen:
pip install torch-cluster
Wenn Pytorch in einem Docker -Container ohne NVIDIA -Treiber ausgeführt wird, muss er die Berechnungsfunktionen bewerten und möglicherweise fehlschlagen. Stellen Sie in diesem Fall sicher, dass die Rechenfunktionen über TORCH_CUDA_ARCH_LIST , z . B.:
export TORCH_CUDA_ARCH_LIST = "6.0 6.1 7.2+PTX 7.5+PTX"
Ein gieriger Clustering -Algorithmus zur Auswahl eines nicht markierten Scheitelpunkts und dem Abzug mit einem seiner nicht markierten Nachbarn (das sein Kantengewicht maximiert). Der GPU -Algorithmus wird von Faggerer Auer und Bisseling angepasst: ein GPU -Algorithmus für gierige Grafikabschnitte (LNCS 2012)
import torch
from torch_cluster import graclus_cluster
row = torch . tensor ([ 0 , 1 , 1 , 2 ])
col = torch . tensor ([ 1 , 0 , 2 , 1 ])
weight = torch . tensor ([ 1. , 1. , 1. , 1. ]) # Optional edge weights.
cluster = graclus_cluster ( row , col , weight ) print(cluster)
tensor([0, 0, 1])
Ein Clustering-Algorithmus, der ein regelmäßiges Gitter der benutzerdefinierten Größe über eine Punktwolke überlagert und alle Punkte innerhalb eines Voxels klustert.
import torch
from torch_cluster import grid_cluster
pos = torch . tensor ([[ 0. , 0. ], [ 11. , 9. ], [ 2. , 8. ], [ 2. , 2. ], [ 8. , 3. ]])
size = torch . Tensor ([ 5 , 5 ])
cluster = grid_cluster ( pos , size ) print(cluster)
tensor([0, 5, 3, 0, 1])
Ein Stichprobenalgorithmus, der iterativ den entfernten Punkt in Bezug auf die Restpunkte iterativ abtastet.
import torch
from torch_cluster import fps
x = torch . tensor ([[ - 1. , - 1. ], [ - 1. , 1. ], [ 1. , - 1. ], [ 1. , 1. ]])
batch = torch . tensor ([ 0 , 0 , 0 , 0 ])
index = fps ( x , batch , ratio = 0.5 , random_start = False ) print(index)
tensor([0, 3])
Berechnet die Grafikkanten zu den nächsten K -Punkten.
Args:
[N, F] .[N] , der jedem Knoten einem bestimmten Beispiel zuweist. batch muss sortiert werden. (Standard: None )True , enthält die Grafik Selbstschleife. (Standard: False )"source_to_target" oder "target_to_source" ). (Standard: "source_to_target" )True , verwendet der Cosinus -Abstand anstelle der euklidischen Entfernung, um die nächsten Nachbarn zu finden. (Standard: False )batch None ist, oder der Eingang liegt in der GPU. (Standard: 1 ) import torch
from torch_cluster import knn_graph
x = torch . tensor ([[ - 1. , - 1. ], [ - 1. , 1. ], [ 1. , - 1. ], [ 1. , 1. ]])
batch = torch . tensor ([ 0 , 0 , 0 , 0 ])
edge_index = knn_graph ( x , k = 2 , batch = batch , loop = False ) print(edge_index)
tensor([[1, 2, 0, 3, 0, 3, 1, 2],
[0, 0, 1, 1, 2, 2, 3, 3]])
Berechnet die Grafikkanten in allen Punkten innerhalb eines bestimmten Abstands.
Args:
[N, F] .[N] , der jedem Knoten einem bestimmten Beispiel zuweist. batch muss sortiert werden. (Standard: None )True , enthält die Grafik Selbstschleife. (Standard: False )max_num_neighbors , werden zurückgegebene Nachbarn zufällig ausgewählt. (Standard: 32 )"source_to_target" oder "target_to_source" ). (Standard: "source_to_target" )batch None ist, oder der Eingang liegt in der GPU. (Standard: 1 ) import torch
from torch_cluster import radius_graph
x = torch . tensor ([[ - 1. , - 1. ], [ - 1. , 1. ], [ 1. , - 1. ], [ 1. , 1. ]])
batch = torch . tensor ([ 0 , 0 , 0 , 0 ])
edge_index = radius_graph ( x , r = 2.5 , batch = batch , loop = False ) print(edge_index)
tensor([[1, 2, 0, 3, 0, 3, 1, 2],
[0, 0, 1, 1, 2, 2, 3, 3]])
Cluster zeigt zusammen zusammen, die einem bestimmten Abfragepunkt in y am nächsten sind. batch_{x,y} Vektoren müssen sortiert werden.
import torch
from torch_cluster import nearest
x = torch . Tensor ([[ - 1 , - 1 ], [ - 1 , 1 ], [ 1 , - 1 ], [ 1 , 1 ]])
batch_x = torch . tensor ([ 0 , 0 , 0 , 0 ])
y = torch . Tensor ([[ - 1 , 0 ], [ 1 , 0 ]])
batch_y = torch . tensor ([ 0 , 0 ])
cluster = nearest ( x , y , batch_x , batch_y ) print(cluster)
tensor([0, 0, 1, 1])
Proben zufällige Wanderungen von Länge walk_length von allen Knotenindizes zu start in der von (row, col) angegebenen Grafik.
import torch
from torch_cluster import random_walk
row = torch . tensor ([ 0 , 1 , 1 , 1 , 2 , 2 , 3 , 3 , 4 , 4 ])
col = torch . tensor ([ 1 , 0 , 2 , 3 , 1 , 4 , 1 , 4 , 2 , 3 ])
start = torch . tensor ([ 0 , 1 , 2 , 3 , 4 ])
walk = random_walk ( row , col , start , walk_length = 3 ) print(walk)
tensor([[0, 1, 2, 4],
[1, 3, 4, 2],
[2, 4, 2, 1],
[3, 4, 2, 4],
[4, 3, 1, 0]])
pytest
torch-cluster bietet auch eine C ++-API an, die C ++-Äquivalent von Python-Modellen enthält.
export Torch_DIR=`python -c 'import torch;print(torch.utils.cmake_prefix_path)'`
mkdir build
cd build
# Add -DWITH_CUDA=on support for the CUDA if needed
cmake ..
make
make install