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://download.pytorch.org/whl/torch_stable.html

1.2 PyG包的安装

以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

2.Cora数据集的下载

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

三、 使用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: <urlopen error [Errno 11004] getaddrinfo failed> 在网上找了很多解决方法,最后把planetoid.py里面第50行的 url = ‘https://github.com/kimiyoung/planetoid/raw/master/data’ 改成 url=‘https://gitee.com/jiajiewu/planetoid/raw/master/data’,得到了解决。 在第一次加载成功之后,它就会自己出现这个数据集的相关文件。而且之前我们自己放的也在,不知道能不能把自己放的那个删掉。

图片来自

总结

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

### 图神经网络 (GNN) 学习资源 对于希望深入了解图神经网络(Graph Neural Networks, GNNs)的学习者来说,有多种高质量的教程、论文和技术博客可以作为参考资料。 #### 论文阅读 一些重要的研究工作奠定了现代GNN的基础。例如,《DeepWalk: Online Learning of Social Representations》探讨了如何通过随机游走的方式捕捉社交网络中的节点特征[^1];《node2vec: Scalable Feature Learning for Networks》则进一步扩展了这一思路,提出了更灵活的方法来生成节点嵌入表示;而《Semi-Supervised Classification with Graph Convolutional Networks》引入了一种基于卷积操作处理图形数据的新框架——GCN(Graph Convolutional Network),它能够有效地利用未标记的数据进行半监督分类任务。 #### 教程视频 除了学术文章外,在线教育平台也提供了许多易于理解的教学材料。比如B站上有一个名为“GNN从入门到精通”的系列课程,该课程由浅入深地讲解了有关GNN的知识点,并配有实际案例分析和编程练习[^3]。 #### 技术文档与笔记整理 为了帮助初学者更好地掌握理论概念并应用于实践当中,“【GNN】图神经网络学习小结and笔记汇总”这份总结性的资料非常有价值。这里不仅含了对核心算法原理详尽解释的文字描述,还有配套代码实现供读者参考学习[^2]。 ```python import torch 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) ``` 上述Python代码片段展示了如何使用PyTorch Geometric库构建简单的两层GCN模型来进行节点分类预测。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值