|
|
Using PyTorch Geometric in DeepRobust |
|
|
======== |
|
|
DeepRobust now provides interface to convert the data between |
|
|
PyTorch Geometric and DeepRobust. |
|
|
|
|
|
.. note:: |
|
|
Before we start, make sure you have successfully installed `torch_geometric |
|
|
<https://pytorch-geometric.readthedocs.io/en/latest/notes/installation.html>`_. |
|
|
After you install torch_geometric, please reinstall DeepRobust to activate |
|
|
the following functions. |
|
|
|
|
|
.. contents:: |
|
|
:local: |
|
|
|
|
|
Converting Graph Data between DeepRobust and PyTorch Geometric |
|
|
----------------------- |
|
|
Given the popularity of PyTorch Geometric in the graph representation learning community, |
|
|
we also provide tools for converting data between DeepRobust and PyTorch Geometric. We can |
|
|
use :class:`deeprobust.graph.data.Dpr2Pyg` to convert DeepRobust data to PyTorch Geometric |
|
|
and use :class:`deeprobust.graph.data.Pyg2Dpr` to convert Pytorch Geometric data to DeepRobust. |
|
|
For example, we can first create an instance of the Dataset class and convert it to pytorch geometric data format. |
|
|
|
|
|
.. code-block:: python |
|
|
|
|
|
from deeprobust.graph.data import Dataset, Dpr2Pyg, Pyg2Dpr |
|
|
data = Dataset(root='/tmp/', name='cora') |
|
|
pyg_data = Dpr2Pyg(data) |
|
|
print(pyg_data) |
|
|
print(pyg_data[0]) |
|
|
dpr_data = Pyg2Dpr(pyg_data) |
|
|
print(dpr_data.adj) |
|
|
|
|
|
For the attacked graph :class:`deeprobust.graph.PrePtbDataset`, it only has the attribute :obj:`adj`. |
|
|
To convert it to PyTorch Geometric data format, we can first convert the clean graph to Pyg and |
|
|
then update its :obj:`edge_index`: |
|
|
|
|
|
.. code-block:: python |
|
|
|
|
|
from deeprobust.graph.data import Dataset, PrePtbDataset, Dpr2Pyg |
|
|
data = Dataset(root='/tmp/', name='cora') |
|
|
pyg_data = Dpr2Pyg(data) |
|
|
|
|
|
perturbed_data = PrePtbDataset(root='/tmp/', |
|
|
name='cora', |
|
|
attack_method='meta', |
|
|
ptb_rate=0.05) |
|
|
perturbed_adj = perturbed_data.adj |
|
|
pyg_data.update_edge_index(perturbed_adj) |
|
|
|
|
|
Now :obj:`pyg_data` becomes the perturbed data in the format of PyTorch Geometric. |
|
|
We can then use it as the input for various Pytorch Geometric models! |
|
|
|
|
|
Load OGB Datasets |
|
|
----------------------- |
|
|
`Open Graph Benchmark (OGB) <https://ogb.stanford.edu/>`_ has provided various benchmark |
|
|
datasets. DeepRobsut now provides interface to convert OGB dataset format (Pyg data format) |
|
|
to DeepRobust format. |
|
|
|
|
|
.. code-block:: python |
|
|
|
|
|
from ogb.nodeproppred import PygNodePropPredDataset |
|
|
from deeprobust.graph.data import Pyg2Dpr |
|
|
pyg_data = PygNodePropPredDataset(name = 'ogbn-arxiv') |
|
|
dpr_data = Pyg2Dpr(pyg_data) |
|
|
|
|
|
|
|
|
Load Pytorch Geometric Amazon and Coauthor Datasets |
|
|
----------------------- |
|
|
DeepRobust also provides access to the Amazon datasets and Coauthor datasets, i.e., |
|
|
`Amazon-Computers`, `Amazon-Photo`, `Coauthor-CS`, `Coauthor-Physics`, from Pytorch |
|
|
Geometric. Specifically, users can access them through |
|
|
:class:`deeprobust.graph.data.AmazonPyg` and :class:`deeprobust.graph.data.CoauthorPyg`. |
|
|
For example, we can directly load Amazon dataset from deeprobust in the format of pyg |
|
|
as follows, |
|
|
|
|
|
.. code-block:: python |
|
|
|
|
|
from deeprobust.graph.data import AmazonPyg |
|
|
computers = AmazonPyg(root='/tmp', name='computers') |
|
|
print(computers) |
|
|
print(computers[0]) |
|
|
photo = AmazonPyg(root='/tmp', name='photo') |
|
|
print(photo) |
|
|
print(photo[0]) |
|
|
|
|
|
|
|
|
Similarly, we can also load Coauthor dataset, |
|
|
|
|
|
.. code-block:: python |
|
|
|
|
|
from deeprobust.graph.data import CoauthorPyg |
|
|
cs = CoauthorPyg(root='/tmp', name='cs') |
|
|
print(cs) |
|
|
print(cs[0]) |
|
|
physics = CoauthorPyg(root='/tmp', name='physics') |
|
|
print(physics) |
|
|
print(physics[0]) |
|
|
|
|
|
|
|
|
Working on PyTorch Geometric Models |
|
|
----------- |
|
|
In this subsection, we provide examples for using GNNs based on |
|
|
PyTorch Geometric. Spefically, we use GAT :class:`deeprobust.graph.defense.GAT` and |
|
|
ChebNet :class:`deeprobust.graph.defense.ChebNet` to further illustrate (while :class:`deeprobust.graph.defense.SGC` is also available in this library). |
|
|
Basically, we can first convert the DeepRobust data to PyTorch Geometric |
|
|
data and then train Pyg models. |
|
|
|
|
|
.. code-block:: python |
|
|
|
|
|
from deeprobust.graph.data import Dataset, Dpr2Pyg, PrePtbDataset |
|
|
from deeprobust.graph.defense import GAT |
|
|
data = Dataset(root='/tmp/', name='cora', seed=15) |
|
|
adj, features, labels = data.adj, data.features, data.labels |
|
|
idx_train, idx_val, idx_test = data.idx_train, data.idx_val, data.idx_test |
|
|
gat = GAT(nfeat=features.shape[1], |
|
|
nhid=8, heads=8, |
|
|
nclass=labels.max().item() + 1, |
|
|
dropout=0.5, device='cpu') |
|
|
gat = gat.to('cpu') |
|
|
pyg_data = Dpr2Pyg(data) |
|
|
gat.fit(pyg_data, patience=100, verbose=True) |
|
|
gat.test() |
|
|
|
|
|
|
|
|
perturbed_data = PrePtbDataset(root='/tmp/', |
|
|
name='cora', |
|
|
attack_method='meta', |
|
|
ptb_rate=0.05) |
|
|
perturbed_adj = perturbed_data.adj |
|
|
pyg_data.update_edge_index(perturbed_adj) |
|
|
gat.fit(pyg_data, patience=100, verbose=True) |
|
|
gat.test() |
|
|
|
|
|
|
|
|
.. code-block:: python |
|
|
|
|
|
from deeprobust.graph.data import Dataset, Dpr2Pyg |
|
|
from deeprobust.graph.defense import ChebNet |
|
|
data = Dataset(root='/tmp/', name='cora') |
|
|
adj, features, labels = data.adj, data.features, data.labels |
|
|
idx_train, idx_val, idx_test = data.idx_train, data.idx_val, data.idx_test |
|
|
cheby = ChebNet(nfeat=features.shape[1], |
|
|
nhid=16, num_hops=3, |
|
|
nclass=labels.max().item() + 1, |
|
|
dropout=0.5, device='cpu') |
|
|
cheby = cheby.to('cpu') |
|
|
pyg_data = Dpr2Pyg(data) |
|
|
cheby.fit(pyg_data, patience=10, verbose=True) |
|
|
cheby.test() |
|
|
|
|
|
|
|
|
More Details |
|
|
----------------------- |
|
|
More details can be found in |
|
|
`test_gat.py <https://github.com/DSE-MSU/DeepRobust/tree/master/examples/graph/test_gat.py>`_, `test_chebnet.py <https://github.com/DSE-MSU/DeepRobust/tree/master/examples/graph/test_chebnet.py>`_ and `test_sgc.py <https://github.com/DSE-MSU/DeepRobust/tree/master/examples/graph/test_sgc.py>`_. |
|
|
|