GNN环境配置和PyG库的使用
一、环境配置
1、确认安装的CUDA版本
nvcc --version
另外一个查看CUDA版本的命令为
nvidia-smi
但我之前安装过两个版本,用这个查出来的版本可能不是IDE中使用的真实版本(其实Windows的话也可以直接用控制面板看版本......)
参考连接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 Planetoiddataset = Planetoid(root='D:/dataset/Cora' , name='Cora' )
PS. 若出现下载连接超时的情况可以参考Planetoid无法直接下载Cora等数据集的3个解决方式_诸神缄默不语的博客-CSDN博客 进行解决。
该数据集只有一个图(len(dataset)
:1)
3、最简单的图神经网络构建流程
直接利用整个原始数据作为一个batch进行模型训练(即不考虑分batch进行训练,且不对数据集做数据增强等变换),则可以画一个最简单的图神经网络构建流程图,如下图所示:
最简单的GNN构建流程图
完整代码:
import torchfrom torch_geometric.datasets import Planetoidimport torch.nn.functional as Ffrom torch_geometric.nn import GCNConvclass 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__' : dataset = Planetoid(root='G:/GNN/dataset/Cora' , name='Cora' ) device = torch.device('cuda' if torch.cuda.is_available() else '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.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实战