本篇文章主要介绍PyG包的安装,并且会介绍如何使用这个包来实现常见的图神经网络模型GCN。
PyG包就是Pytorch Geometric库,Pytorch Geometric库是常用的图神经网络库。
pytorch-geometric需要以pytorch1.7.0以上为基础,因此首先需要安装pytorch 1.7.0以上版本。这里以1.8.0的cpu版本为例。
注意pytorch和Python版本的匹配,我是直接用anaconda创建了个Python3.6.5的虚拟环境,据说Python3.6.5和pytorch的很多版本都能匹配,不知道是不是真的,但是我安装过程没有报错,很顺利。建议直接在anaconda的命令行安装,比较快。
# CPU
pip install torch==1.8.0+cpu torchvision==0.9.0+cpu torchaudio==0.8.0 -f https://download.pytorch.org/whl/torch_stable.html
以cpu版本为例,注意这里的torch-1.8.0要和第一步自己选择安装的pytorch版本一致。
pip install torch-scatter -f https://pytorch-geometric.com/whl/torch-1.8.0+cpu.html
pip install torch-sparse -f https://pytorch-geometric.com/whl/torch-1.8.0+cpu.html
pip install torch-cluster -f https://pytorch-geometric.com/whl/torch-1.8.0+cpu.html
pip install torch-spline-conv -f https://pytorch-geometric.com/whl/torch-1.8.0+cpu.html
pip install torch-geometric
下载链接:https://github.com/kimiyoung/planetoid
在首次加载数据时需要从网上自行下载,并把里面的cora文件放在如下目录中。否则会报错。
代码如下
# 导入需要的包
import torch
import torch.nn.functional as F
# 导入GCN层、GraphSAGE层和GAT层
from torch_geometric.nn import GCNConv, SAGEConv, GATConv
from torch_geometric.datasets import Planetoid
# 加载数据,第一次加载需要自行下载
dataset = Planetoid(root='./tmp/Cora', name='Cora')
class GCN_NET(torch.nn.Module):
def __init__(self, features, hidden, classes):
super(GCN_NET, self).__init__()
self.conv1 = GCNConv(features, hidden) # shape(输入的节点特征维度 * 中间隐藏层的维度)
self.conv2 = GCNConv(hidden, classes) # shaape(中间隐藏层的维度 * 节点类别)
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) # dropout层,防止过拟合
x = self.conv2(x, edge_index) # 第二层卷积层
# 将经过两层卷积得到的特征输入log_softmax函数得到概率分布
return F.log_softmax(x, dim=1)
# 判断是否有GPU
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# 构建模型,设置中间隐藏层维度为16
model = GCN_NET(dataset.num_node_features, 16, dataset.num_classes).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 = int(pred[data.test_mask].eq(data.y[data.test_mask]).sum().item()) # 计算正确的个数
acc = correct / int(data.test_mask.sum()) # 得出准确率
print('GCN Accuracy: {:.4f}'.format(acc))
经测试,自行下载了数据集,报错:URLError:
第一次写,感觉没有什么头绪,有点乱乱的,参考文章如下:
https://blog.csdn.net/jmh1996/article/details/115447620
https://zhuanlan.zhihu.com/p/391054539
都是写的特别好的文章,让我受益很大,写这篇文章主要是为了记录一下自己的学习过程,再次感谢厉害的大佬们。