GNN学习

PyG包的安装及使用

前言

本篇文章主要介绍PyG包的安装,并且会介绍如何使用这个包来实现常见的图神经网络模型GCN。

一、PyG包是什么?

PyG包就是Pytorch Geometric库,Pytorch Geometric库是常用的图神经网络库。

二、安装步骤

1.安装pytorch和PyG

pytorch-geometric需要以pytorch1.7.0以上为基础,因此首先需要安装pytorch 1.7.0以上版本。这里以1.8.0的cpu版本为例。

1.1 pytorch安装

注意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:

1.2 PyG包的安装

以cpu版本为例,注意这里的torch-1.8.0要和第一步自己选择安装的pytorch版本一致。

pip install torch-scatter -f https:
pip install torch-sparse -f https:
pip install torch-cluster -f https:
pip install torch-spline-conv -f https:
pip install torch-geometric

2.Cora数据集的下载

下载链接:https://github.com/kimiyoung/planetoid
在首次加载数据时需要从网上自行下载,并把里面的cora文件放在如下目录中。否则会报错。

GNN学习

; 三、 使用PyG实现GCN

代码如下

导入需要的包
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:

GNN学习

; 总结

第一次写,感觉没有什么头绪,有点乱乱的,参考文章如下:
https://blog.csdn.net/jmh1996/article/details/115447620
https://zhuanlan.zhihu.com/p/391054539
都是写的特别好的文章,让我受益很大,写这篇文章主要是为了记录一下自己的学习过程,再次感谢厉害的大佬们。

Original: https://blog.csdn.net/qq_43317281/article/details/124249801
Author: 改个名字可真难啊
Title: GNN学习

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/691958/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球