GNN环境配置和PyG库的使用

一、环境配置

1、确认安装的CUDA版本

nvcc --version

另外一个查看CUDA版本的命令为

nvidia-smi

但我之前安装过两个版本,用这个查出来的版本可能不是IDE中使用的真实版本(其实Windows的话也可以直接用控制面板看版本......)

2、安装正确版本的pytorch和cudatoolkit

参考连接win10+cuda10.2安装pytorch1.7.1(使用清华镜像源) - WoLi - 博客园 (cnblogs.com)

Previous PyTorch Versions | PyTorch

# CUDA 10.1
conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=10.1 -c pytorch

命令行输入以下命令,确认是否正确安装:

python
import torch
print(torch.__version__)

3、安装正确版本的PyG

pip install torch-scatter -f https://pytorch-geometric.com/whl/torch-1.7.0+cu101.html
pip install torch-sparse -f https://pytorch-geometric.com/whl/torch-1.7.0+cu101.html
pip install torch-cluster -f https://pytorch-geometric.com/whl/torch-1.7.0+cu101.html
pip install torch-spline-conv -f https://pytorch-geometric.com/whl/torch-1.7.0+cu101.html
pip install torch-geometric

其他版本的安装方法以及安装过程中出现的大部分问题的解决方案可以在Installation of of PyTorch Geometric页面找到。

命令行输入以下命令,不报错即可

python
import torch
from torch_geometric.data import Data

常见错误:

1、FileNotFoundError: Could not find module ‘D:3_c.dll

需要安装正确版本的shapely:

pip install shapely

参考:FileNotFoundError: Could not find module ‘D:3_c.dll‘解决方法_锦鲤AI幸运的博客-CSDN博客

2、FileNotFoundError: Could not find module 'D:3-packages_sparse_convert_cuda.pyd' (or one of its dependencies). Try using the full path with constructor syntax.

注意安装的torch版本和PyG版本是否匹配。打印torch.__version__确认版本,在Previous PyTorch Versions | PyTorch中找到正确pytorch版本进行安装。

二、PyG的使用

1、Data类

Data类的官方文档为torch_geometric.data.Data

Data类的构造函数

class Data(object):

def __init__(self, x=None, edge_index=None, edge_attr=None, y=None, **kwargs):
r"""
Args:
x (Tensor, optional): 节点属性矩阵,大小为`[num_nodes, num_node_features]`
edge_index (LongTensor, optional): 边索引矩阵,大小为`[2, num_edges]`,第0行为尾节点,第1行为头节点,头指向尾
edge_attr (Tensor, optional): 边属性矩阵,大小为`[num_edges, num_edge_features]`
y (Tensor, optional): 节点或图的标签,任意大小(,其实也可以是边的标签)

"""
self.x = x
self.edge_index = edge_index
self.edge_attr = edge_attr
self.y = y

for key, item in kwargs.items():
if key == 'num_nodes':
self.__num_nodes__ = item
else:
self[key] = item

可以通过继承Data类构建专属的数据类,这样可以满足自定义数据的需求

class MyData(Data):
def __init__(self,attr):
super().__init__()
self.myattr=attr

2、Dataset类及自带的训练集

PyG内置了大量常用的基准数据集,以PyG内置的Planetoid数据集为例。Planetoid数据集类的官方文档为torch_geometric.datasets.Planetoid

from torch_geometric.datasets import Planetoid

dataset = Planetoid(root='D:/dataset/Cora', name='Cora')#包括数据集的下载,若root路径存在数据集则直接加载数据集

PS.若出现下载连接超时的情况可以参考Planetoid无法直接下载Cora等数据集的3个解决方式_诸神缄默不语的博客-CSDN博客进行解决。

该数据集只有一个图(len(dataset):1)

data = dataset[0]
# Data(edge_index=[2, 10556], test_mask=[2708],
# train_mask=[2708], val_mask=[2708], x=[2708, 1433], y=[2708])

3、最简单的图神经网络构建流程

直接利用整个原始数据作为一个batch进行模型训练(即不考虑分batch进行训练,且不对数据集做数据增强等变换),则可以画一个最简单的图神经网络构建流程图,如下图所示:

最简单的GNN构建流程图
最简单的GNN构建流程图

完整代码:

import torch
from torch_geometric.datasets import Planetoid
import torch.nn.functional as F
from torch_geometric.nn import GCNConv

#定义网络结构
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = GCNConv(dataset.num_node_features, 16)
self.conv2 = GCNConv(16, dataset.num_classes)

def forward(self, data):
x, edge_index = data.x, data.edge_index

x = self.conv1(x, edge_index)
x = F.relu(x)
x = F.dropout(x, training=self.training)
x = self.conv2(x, edge_index)

return F.log_softmax(x, dim=1)

if __name__ == '__main__':
#加载数据,以自带的Cora数据集为例
dataset = Planetoid(root='G:/GNN/dataset/Cora', name='Cora')
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
#将数据和模型放到GPU或CPU上
model = Net().to(device)
data = dataset[0].to(device)
#优化器
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)

#训练
model.train()
for epoch in range(200):
optimizer.zero_grad()
out = model(data)
loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask]) #loss function
loss.backward()
optimizer.step()

#测试
model.eval()
_, pred = model(data).max(dim=1)
correct = float(pred[data.test_mask].eq(data.y[data.test_mask]).sum().item())
acc = correct / data.test_mask.sum().item()
print('Accuracy: {:.4f}'.format(acc))

更复杂一点的可以参考:图神经网络 | (4) GCN实战_sdu_hao的博客-CSDN博客_gcn实战

参考资料

3-环境配置与PyG库

PyG官网

番外篇:PyG框架及Cora数据集简介 - 知乎 (zhihu.com)

图神经网络 | (4) GCN实战_sdu_hao的博客-CSDN博客_gcn实战