使用pytorch 的相关神经网络库, 手动编写图卷积神经网络模型(GCN), 并在相应的图结构数据集上完成节点分类任务。本次实验的内容如下:
- 实验准备:搭建基于GPU的pytorch实验环境。
- 数据下载与预处理:使用torch_geometric.datasets、torch_geometric.loader所提供的标准数据接口Planetoid、PPI、DataLoader,将原始数据处理为方便模型训练脚本所使用的数据结构。
- 图网络模型:手动搭建GCN模型。
- 节点分类:在给定数据集上按照节点分类任务的需求自行划分训练集、验证集、测试集,并用搭建好的GCN模型进行节点分类。
- 模型训练:在给定数据集上训练模型并分析结果。
本文主要讲PPI数据集的处理和训练。
对应的源代码下载链接 :
https://download.csdn.net/download/m0_61142248/87657668
1.搭建实验环境
搭建GPU版Pytorch实验环境如下:
名称 | 版本 | 备注 |
Python | 3.8 | |
Pytorch | 1.12.1 | |
GPU | RTX2060 | 安装对应版本的cuda |
2.图网络模型搭建
参考GCN论文,GCN的核心原理公式为 。因为邻接矩阵在迭代的每一步都是相同的,可以将上述公式中不变的部分提取出来提前处理,迭代过程中只计算变化部分,从而减少运算量。因此将上述公式分解为两步:
其中, 是图的原始邻接矩阵,D是度矩阵, 的运算在网络模型训练前实现,A是经过处理后的邻接矩阵。
在图数据的处理中实现计算,代码如下:
在网络模型中只实现 ,另外需要定义模型参数W等初始化参数以及forward函数。本次实验要求对自环、层数、 DropEdge、PairNorm、激活函数等因素分析,因此在模型 中加入了这些参数,另外模型中的in_features和out_features分别表示输入特征维度和输出特征维度。代码如下:
子函数reset_parameters代码如下:
forward函数实现计算,其中input为输入特征,adj为输入邻接矩阵(经过 运算处理),bias是偏置项,output为输出。具体代码如下:
此外,参考了PairNorm和DropEdge的论文和代码来实现PairNorm和DropEdge函数。具体代码如下:
PairNorm:
DropEdge:
3.节点分类模型搭建
在节点分类任务中搭建了一个由前述GCN网络组成的多层GCN分类网络。节点分类模型初始化函数如下:
其中各参数含义如下:
- nfeat为输入特征维度;
- nhid为GCN隐藏层维度;
- nclass为输出特征维度;
- dropout为特征的dropout率;
- SelfLoop为是否加自环的标志;
- num_layers表示该分类模型的总层数;
- norm_mode表示是否使用batchnorm;
- use_PairNorm表示是否使用PairNorm;
- activation为激活函数的参数,表示使用哪种激活函数。
节点分类模型中间层的激活函数由输入参数‘activation’确定,输出的特征维度为‘nhid’。最后一层也是GCN层,输出维度为‘nclass’,最后的输出增加了log_softmax()函数。
与Cora、Citeseer数据集的节点分类模型不同,PPI数据集的节点分类模型的forward函数的输出没有加log_softmax()函数,代码如下:
4.PPI数据集预处理
PPI数据集是比较常用的数据集,直接百度即可下载。
使用torch_geometric的datasets、transforms和loader库进行PPI数据的读取、数据集划分和邻接矩阵处理,数据集包含24张图,其中20张用于训练(train_dataset)、2张用于验证(val_dataset),2张用于测试(test_dataset)。代码如下:
5.训练与分析
训练与分析方法与cora数据集的类似,可以参考另一篇博文。