图卷积神经网络GCN之链路预测

本文详述了如何在PyTorch环境中搭建基于GPU的实验平台,利用torch_geometric处理Planetoid、PPI数据集,构建GCN模型进行链路预测任务。通过对模型层数、自环、PairNorm、DropEdge等参数的分析,展示了在Cora和Citeseer数据集上的最佳性能配置,如4层GCN、无自环、使用BatchNorm和PairNorm,以及线性激活函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用pytorch 的相关神经网络库, 手动编写图卷积神经网络模型(GCN), 并在相应的图结构数据集上完成链路预测任务。本次实验的内容如下:

  1. 实验准备:搭建基于GPU的pytorch实验环境。
  2. 数据下载与预处理:使用torch_geometric.datasets、torch_geometric.loader所提供的标准数据接口Planetoid、PPI、DataLoader,将原始数据处理为方便模型训练脚本所使用的数据结构。
  3. 图网络模型:手动搭建GCN模型。
  4. 链路预测:在给定数据集上按照链路预测任务的需求自行划分训练集、验证集、测试集,并用搭建好的GCN模型进行链路预测。
  5. 模型训练:在给定数据集上训练模型并分析结果。

对应的源代码下载链接 :

https://download.csdn.net/download/m0_61142248/87657680

1.搭建实验环境

搭建GPU版Pytorch实验环境如下:

名称

版本

备注

Python

3.8

Pytorch

1.12.1

GPU

RTX2060

安装对应版本的cuda

 2.图网络模型搭建

参考GCN论文,GCN的核心原理公式为 H^{l+1}=\sigma\left ( D^{1/2}AD^{-1/2}H^{l}W^{l} \right )。因为邻接矩阵在迭代的每一步都是相同的,可以将上述公式中不变的部分提取出来提前处理,迭代过程中只计算变化部分,从而减少运算量。因此将上述公式分解为两步:

  1. A=D^{^{1/2}}AdjD^{-1/2}
  2. H^{l+1}=AH^{l}W^{l}   

其中,Adj 是图的原始邻接矩阵,D是度矩阵, 的运算在网络模型训练前实现,A是经过处理后的邻接矩阵。

在图数据的处理中实现A=D^{^{1/2}}AdjD^{-1/2}计算,代码如下:

在网络模型中只实现 H^{l+1}=AH^{l}W^{l},另外需要定义模型参数W等初始化参数以及forward函数。本次实验要求对自环、层数、 DropEdge、PairNorm、激活函数等因素分析,因此在模型 中加入了这些参数,另外模型中的in_features和out_features分别表示输入特征维度和输出特征维度。代码如下:

子函数reset_parameters代码如下:

forward函数实现H^{l+1}=AH^{l}W^{l}计算,其中input为输入特征,adj为输入邻接矩阵(经过 运算处理),bias是偏置项,output为输出。具体代码如下:

此外,参考了PairNorm和DropEdge的论文和代码来实现PairNorm和DropEdge函数。具体代码如下:

PairNorm:

DropEdge:

3.链路预测模型搭建

在链路预测中使用的基础GCN模型与节点分类任务相同,链路预测任务的模型采用了GAE网络模型。GAE网络模型包含一个由多层GCN组成的编码器和一个内积运算组成的解码器,其中GCN基础层与前述节点分类中提到的GCN网络相同。GAE网络模型的具体实现代码如下:

GAE网络初始化部分:

编码器与解码器: 

 4.Cora、Citeseer数据集预处理

数据读取,根据实验任务参数,分别读取cora和citeseer数据集。

数据集划分,在每个数据集的图中存在的链接数往往都是远小于不存在的链接数的,即图中的正样本数量远小于负样本数量。为了使模型训练较为均衡,通常先将正样本分为训练集、验证集和测试集,然后再分别从三个数据集中采样等同数量的负样本参与训练、验证以及测试。这里使用RandomLinkSplit函数将图随机划分为训练集、验证集和测试集,比例为0.8:0.1:0.1。add_negative_train_samples为False表示不对训练集进行负采样,只对测试集和验证集进行负采样,每个子集的正负样本比例为1:1。训练集的负样本在训练时采集。

邻接矩阵处理:

5.训练与分析

依据实验要求对不同参数进行了测试分析。虽然不同参数配置下可以通过调整学习率等超参数来提高性能。但为了便于比较,训练时采取了只变动比较项,其余部分参数固定的方法来分析单个因素对模型性能的影响。其中所有测试下都固定不变的参数如下表所示:

固定不变的训练参数

测试了GCN层数为2、4、8、16、32层时图网络模型在Cora、Citeseer和PPI数据集上的分类性能以及自环、batch_norm、PairNorm和激活函数等因素对分类性能的影响。

在Cora数据集和Citeseer数据集的实验中,使用Adam优化器。学习率初始值为0.01,采用了多步衰减策略,参数为“milestones=[150, 250, 350], gamma=0.5”。损失函数使用torch.nn.functional中的nll_loss。性能评价指标为acc。

最终得到的最佳的性能和对应的训练参数如下:

名称

lr

weight_decay

hidden 

lradjust

dropout

epochs

数值

0.01

5e-3

256

Ture

0.8

400

测试了GCN层数为2、4、8、16、32层时图网络模型在Cora和Citeseer数据集上的分类性能以及自环、batch_norm、PairNorm和激活函数等因素对分类性能的影响。

在Cora数据集和Citeseer数据集的实验中,使用Adam优化器。学习率初始值为0.01,采用了多步衰减策略,参数为“milestones=[150, 250, 350], gamma=0.5”。损失函数使用“torch.nn.BCEWithLogitsLoss()”。性能评价指标为auc。

对于数据集cora,在测试集上获得的分类acc指标为0.936,设置训练参数如下:

名称

lr

weight_decay

hidden 

lradjust

dropout

epochs

数值

0.01

5e-3

256

Ture

0.8

100

名称

num_layers

add_self_loops

add_bn

use_pairnorm

drop_edge

activation

数值

4

FALSE

TRUE

None

1

linear

对于数据集citeseer,在测试集上获得的分类acc指标为0.946,设置训练参数如下:

名称

lr

weight_decay

hidden 

lradjust

dropout

epochs

数值

0.01

5e-3

256

Ture

0.8

100

名称

num_layers

add_self_loops

add_bn

use_pairnorm

drop_edge

activation

数值

4

FALSE

TRUE

None

1

linear

 

基于Pytorch框架手动构建GCN图卷积神经网络python源码+详细注释+实验报告.zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 基于Pytorch框架手动构建GCN图卷积神经网络python源码+详细注释+实验报告.zip 实验要求 使用 pytorch 或者 tensorflow 的相关神经网络库,编写图卷积神经网络模型 (GCN),并在相应的图结构 数据集上完成节点分类和链路预测任务,最后分析自环、层数、DropEdge 、PairNorm 、激活函数等 因素对模型的分类和预测性能的影响 。 实验步骤 1. 网络框架:要求选择 pytorch 或 tensorflow 其中之一,依据官方网站的指引安装包。(如果前面 实验已经安装过,则这个可以跳过) 2. 数据集:本次实验使用的数据包含两个常用的图结构数据集:Cora 、Citeseer 。下面分别进行介绍。 数据预处理:你需要通过pytorch或tensorflow所提供的标准数据接口,将原始数据处理为方便模 型训练脚本所使用的数据结构,如torch.utils.data.Dataset/或者使用dgl库进行数据的处理等。 由于这两个数据集是非常常见的公开数据集,你可以参考一些公开代码片段 模型搭建:搭建GCN模型,这一步可以参考网络上公开的源码,但不能直接使用封装过的库(即不 得使用已经封装好的GCN进行构建,请自行实现GCN网络的搭建,如GraphConv需要自己手动实 现,不得使用已经封装好的)。 提示:不能直接调用PyG等图网络库,因为本实验的主要目的就是希望大家通过编码熟悉图网络的结构和实现 细节。但是允许并鼓励大家多去看看这些库以及其他公开实现的源码,直接改进自己代码是可以的 5. 模型训练:将生成的训练集输入搭建好的模型进行前向的 loss 计算和反向的梯度传播,从而训练 模型,同时也建议使用网络框架封装的 optimizer 完成参数更新过程。训练过程中记录模型在训练 集和验证集上的损失,并绘图可视化。 6. 节点分类:在两个数据集上按照节点分类任务的需求自行划分训练集、验证集、测试集,并用搭建 好的GCN模型进行节点分类。 7. 链路预测:在两个数据集上按照链路预测任务的需求自行划分训练集、验证集、测试集,并用搭建 好的GCN模型进行链路预测。 8. 调参分析:将训练好的模型在验证集上进行测试,以 Top 1 Accuracy(ACC) 作为节点分类指标, AUC(Area Under the Curve)作为链路预测任务的指标。然后,对自环、层数、DropEdge 、 PairNorm 、激活函数进行调整,再重新训练、测试,并分析对模型性能的影响。 9. 测试性能:选择你认为最合适的(例如,在验证集上表现最好的)一组超参数,重新训练模型,并 在测试集上测试(注意,这理应是你的实验中唯一一次在测试集上的测试),并记录测试的结果 (节点分类:Top1 ACC, 链路预测:AUC)
GCN (Graph Convolutional Network)是一种用于图数据的机器学习模型,能够利用图结构中的节点和边的信息进行学习和预测任务。PYG (PyTorch Geometric)是基于PyTorch的一个开源库,提供了处理图数据的工具和模型。 GCN链路预测是指利用GCN模型对图数据中不存在的边进行预测,判断这些边在图中是否会存在。这种预测任务在社交网络、生物学、推荐系统等领域具有重要的应用。在PYG中,可以使用其提供的图卷积层和其他模型构建一个GCN链路预测的模型。 在使用PYG进行GCN链路预测时,首先需要构建一个图对象,将节点和边的信息加载到图中。可以使用PYG提供的数据加载器来导入图数据,并将其转换为图对象。然后,需要定义GCN模型的结构,包括图卷积层的设置和激活函数的选择。PYG提供了许多常用的图卷积层和激活函数的实现,可以根据具体任务选择适合的模型结构。 接下来,可以使用GCN模型对图数据进行训练和预测。训练阶段,可以使用已知的边来构建训练集,并根据GCN模型的输出与真实标签之间的差异来优化模型参数。预测阶段,可以使用已有的模型对不存在的边进行预测,通常是根据模型输出的概率值或阈值来判断边的存在性。 最后,可以根据预测结果进行评估和分析。常用的评估指标包括准确率、召回率、F1值等,可以通过比较预测结果和真实标签来计算这些指标。此外,还可以通过可视化图数据和GCN模型的注意力机制等来分析模型的学习过程和预测结果。 总之,利用PYG中的GCN模型进行链路预测需要加载图数据、构建模型、训练和预测,并进行评估和分析。通过这一过程,可以预测不存在的边的存在性,为实际应用提供决策和指导。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

动力澎湃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值