【图神经网络】Pytorch图神经网络库——PyG基础操作

news2024/11/18 20:33:18

Pytorch图神经网络库——PyG基础操作

  • 图数据处理
  • 常用的基准数据库
    • Mini-Batches
  • Data Transforms
  • 图学习方法
  • 参考资料

PyG(PyTorch Geometric)是一个基于PyTorch构建的库,可轻松编写和训练图神经网络(GNN),用于与结构化数据相关的广泛应用。

它包括从各种已发表的论文中的图和其他不规则结构(也称为几何深度学习geometric deep learning)的各种方法。此外,它由易于使用的mini-batch加载器组成,用于在许多小型和单个巨型图上操作,多GPU支持,DataPipe支持,通过Quiver分布式图形学习,大量常见的基准数据集(基于简单的交互创建自己的界面),Graphgym实验管理器和有用的转换,可以在任意图以及3D网格或点云上学习。
PyG

图数据处理

单张图被PyG表示为torch_geometric.data.Data类型,有如下属性:
data.x: 节点的特征矩阵,形状为 [num_nodes, num_node_features]
data.edge_index: COO格式的图的边 shape [2, num_edges] and type torch.long
data.edge_attr:边的特征矩阵 shape [num_edges, num_edge_features]
data.y:训练数据的标签,节点级的目标 shape [num_nodes, *] or 图级的目标 shape [1, *]
data.pos: 节点的位置矩阵 shape [num_nodes, num_dimensions]

这些属性都不是必需的。事实上,Data 对象甚至不限于这些属性。例如,我们可以通过 data.face 扩展它,以保存形状为[3,num _ faces ]torch.long 类型的张量中3D 网格中三角形的连通性。

PyTorch和torchvision将示例定义为图像和目标的元组。我们在PyG中省略了这个符号,以便以清晰易懂的方式实现各种数据结构。

我们展示了一个具有三个节点和四条边的未加权无向图的简单示例。每个节点仅包含一个特征:

import torch
from torch_geometric.data import Data

# 一个无权无向图的示例
# 边的索引 COO格式 就是说第一行代表行索引 第二行代表列索引
# 节点0和1之间有一条边;节点1和2之间有一条边 
edge_index = torch.tensor([[0, 1, 1, 2], 
                           [1, 0, 2, 1]], dtype=torch.long)
# 节点0 1 2的特征分别是
x = torch.tensor([[-1], [0], [1]], dtype=torch.float)

data = Data(x=x, edge_index=edge_index)
#>>> Data(x=[3, 1], edge_index=[2, 4])

图示意图
注意 edge _ index,即定义所有边的源节点和目标节点的张量,不是索引元组的列表。如果想这样写你的索引,应该在将它们传递给数据构造函数之前对它进行转置和调用:

# 不是COO格式的边,而是使用边的两个节点的元组形式
edge_index = torch.tensor([[0, 1],
                           [1, 0],
                           [1, 2],
                           [2, 1]], dtype=torch.long)
x = torch.tensor([[-1], [0], [1]], dtype=torch.float)

data = Data(x=x, edge_index=edge_index.t().contiguous())

虽然图只有两条边,但是我们需要定义四个索引元组来表示边的两个方向。
注意,edge _ index 中的元素必须只保存范围{0,... ,num _ node-1}内的索引。这是必需的,因为我们希望我们的最终数据表示尽可能紧凑,例如,我们希望通过 x [0]x [1]分别索引第一个边(0,1)的源和目标节点特征。

对于data提供了如下方法进行访问:

print(data.keys)
>>> ['x', 'edge_index']

print(data['x'])
>>> tensor([[-1.0],
            [0.0],
            [1.0]])

for key, item in data:
    print(f'{key} found in data')
>>> x found in data
>>> edge_index found in data

'edge_attr' in data
>>> False

data.num_nodes
>>> 3

data.num_edges
>>> 4

data.num_node_features
>>> 1

data.has_isolated_nodes()
>>> False

data.has_self_loops()
>>> False

data.is_directed()
>>> False

# Transfer data object to GPU.
device = torch.device('cuda')
data = data.to(device)

可以在torch_geometric.data.data中找到所有方法的完整列表。

常用的基准数据库

PyG包含大量常见的基准数据集,例如所有Planetoid数据集(CoraCitseeerPubmed)、来自http://graphkernels.cs.tu-dortmund.de的所有图分类数据集以及它们的简化版本,QM7QM9数据集,以及少量3D网格/点云数据集,如FAUSTModelNet10/40ShapeNet

初始化数据集很简单。数据集的初始化将自动下载其原始文件并将其处理为前面描述的 Data 格式。例如,要加载 ENZYMES 数据集(包括6个类中的600个图形) ,输入:

from torch_geometric.datasets import TUDataset
dataset = TUDataset(root='../DemoData/ENZYMES', name='ENZYMES')

len(dataset) # 600
dataset.num_classes # 6
dataset.num_node_features # 3
# 查看第一张图
data = dataset[0]
data # Data(edge_index=[2, 168], x=[37, 3], y=[1])
data.is_undirected() # True

我们可以看到数据集中的第一个图包含37个节点,每个节点有3个特性。有168/2 = 84条无向边,图被分配到一个类中。此外,数据对象只持有一个图级目标。
我们甚至可以使用切片、long或bool张量来分割数据集。例如,要创建90/10的训练/测试分割,输入:

train_dataset = dataset[:540]
>>> ENZYMES(540)

test_dataset = dataset[540:]
>>> ENZYMES(60)

# 同样 也可以打乱数据
dataset = dataset.shuffle()
>>> ENZYMES(600)

# 等于这个操作
perm = torch.randperm(len(dataset))
dataset = dataset[perm]
>> ENZYMES(600)

让我们再试一个! 我们下载Cora,半监督图节点分类的标准基准数据集,这个数据集是图神经网络论文中经常看见的数据集,是一个论文的引用图,节点的特征为论文的词向量:

from torch_geometric.datasets import Planetoid

dataset = Planetoid(root='/tmp/Cora', name='Cora')
>>> Cora()

len(dataset)
>>> 1 # 数据集只有一张图

dataset.num_classes
>>> 7 # 分为7类

dataset.num_node_features
>>> 1433 # 每个节点有1433维特征

data = dataset[0]
>>> Data(edge_index=[2, 10556], test_mask=[2708],
         train_mask=[2708], val_mask=[2708], x=[2708, 1433], y=[2708])
data.is_undirected()
>>> True

注意:可能会出现:TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
解决方法可以更改源码中的下载地址。

Data对象保存每个节点的标签,以及额外的节点级属性:train_maskval_masktest_mask,其中

  • Train_mask表示要训练哪个节点(140个节点),
  • Val_mask表示使用哪些节点进行验证,例如,执行早期停止(500个节点),
  • Test_mask表示要测试哪个节点(1000个节点)。

比如data.train_mask是一个一维的bool类型的tensor,里面的数据是True就代表是训练数据。

data.train_mask.sum().item()
>>> 140

data.val_mask.sum().item()
>>> 500

data.test_mask.sum().item()
>>> 1000

Mini-Batches

神经网络通常以批处理方式进行训练。PyG通过创建稀疏块对角邻接矩阵(由edge_index定义)并在节点维度中连接特征矩阵和目标矩阵,在小批量上实现并行化。这种组合允许在一个批处理中不同数量的节点和边
稀疏块对角邻接矩阵
PyG包含它自己的torch_geometric.loader.DataLoader,它已经处理了这个连接过程。其实使用的过程和torch里面的DataLoader是一样的:
mini-batches
torch_geometric.data.Batchtorch_geometric.data.Data继承,并包含称为batch的附加属性。batch是一个列向量,保存了batch中每个节点和对应图的映射关系。可以使用batch来计算batch中每个图中各个节点的平均特征。

from torch_scatter import scatter_mean

for data in loader:
    print(data) # DataBatch(batch=[1082], edge_index=[2, 4066], x=[1082, 21], y=[32])
    print(data.num_graphs) # 32
    x = scatter_mean(data.x, data.batch, dim=0)
    print(x.size()) # torch.Size([32, 21])

Data Transforms

下面以一个例子来解释,ShapeNet数据集是包含17000个3D点云的数据集

from torch_geometric.datasets import ShapeNet

dataset = ShapeNet(root='/tmp/ShapeNet', categories=['Airplane'])

dataset[0]
>>> Data(pos=[2518, 3], y=[2518])

我们可以通过transforms将点云生成最近邻图,将点云数据集转换为图数据集:

import torch_geometric.transforms as T
from torch_geometric.datasets import ShapeNet
# 主要就是加了最后一个参数pre_transform
dataset = ShapeNet(root='/tmp/ShapeNet', categories=['Airplane'],pre_transform=T.KNNGraph(k=6))

dataset[0]
>>> Data(edge_index=[2, 15108], pos=[2518, 3], y=[2518])

pre_transform参数可以在数据存入磁盘之前进行转换,在下次使用时,数据集将自动包含边

此外,我们可以使用transform参数来随机增强一个Data对象,例如,将每个节点的位置转换为一个小数字:

import torch_geometric.transforms as T
from torch_geometric.datasets import ShapeNet

dataset = ShapeNet(root='../DemoData/ShapeNet', categories=['Airplane'], pre_transform=T.KNNGraph(k=6), transform=T.RandomTranslate(0.01))
dataset[0] # Data(x=[2518, 3], y=[2518], pos=[2518, 3], category=[1])

图学习方法

在学习了PyG中的数据处理、datasets, loader 以及 transforms之后,是时候实现我们的第一个图形神经网络了!

我们将使用一个简单的 GCN 层,并在 Cora 引文数据集上复制实验。要了解 GCN 的高层解释,可以看看它的博客文章。

首先,加载数据集:

from torch_geometric.datasets import Planetoid

dataset = Planetoid(root='/data/Cora', name='Cora')

然后,定义一个两层的GCN,和torch里面的定义方式一样,只是在传入GCN网络时传的是两个参数,第一个是数据特征,第二个是边的index数据特征x就是每个节点的特征向量edge_index就是(2,节点数)的Tensor,表示哪两个节点之间有边。卷积层后面的ReLU激活函数以及dropout层也是常用的,也不做介绍。

import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv

class GCN(torch.nn.Module):
    def __init__(self):
        super().__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)

然后对网络进行训练,训练的方式也是和torch中形式一样的:

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = GCN().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).argmax(dim=1)
correct = (pred[data.test_mask] == data.y[data.test_mask]).sum()
acc = int(correct) / int(data.test_mask.sum())
print(f'Accuracy: {acc:.4f}')
>>> Accuracy: 0.8150

最后做个总结:使用PyG创建图神经网络模型的过程,和基于Pytorch的过程差不多,其中最重要的是DataLoader的写法。
需要注意的是,如果使用 torch_geometric.datasets中没有的数据集的话,将数据转化为图的形式可能需要一些时间

参考资料

[1] https://pytorch-geometric.readthedocs.io/en/latest/notes/introduction.html
[2] https://github.com/pyg-team/pytorch_geometric
[3] https://blog.csdn.net/qq_40344307/article/details/122160733
[4] GRAPH CONVOLUTIONAL NETWORKS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Web安全】访问控制

目录 1、权限与授权 2、垂直权限管理 3、水平权限管理 4、OAuth 1、权限与授权 权限控制,或者说访问控制,指的是当用户需要执行某个操作时,系统对这种操作的权限限制就是权限控制。 在网络中,一般是通过路由设备或者防火墙建立…

[oeasy]python0031_挂起进程_恢复进程_进程切换

查看进程 回忆上次内容 上次修改了 $PATH 路径 把当前用户shiyanlou的宿主文件夹 ~ 添加到 $PATH 中这样 sleep.py 就可以被找到于是就可以被执行了 还可以把配置 $PATH 的脚本 放到 zsh的配置文件(~/.zshrc) 中 配置 ~/.zshrc 就可以 设置 zsh 环境下默认的 $PATH 在当前路径…

攻防世界-easytornado

题目 访问题目路径 分别点击一下看看 然后我去百度了一下md5(cookie_secretmd5(filename))发现这是一个叫模板注入的东西 什么是模板 简单来说,就是网站内容的动态部分,如果有一个网站的内容几乎相同,但只有某些部分发生改变,那么…

javaweb学习之会话技术CookieSession05

目录 1.会话技术 2.快速入门 3.实现原理 4.cookiel的细节 2.cookie能不能存中文 3.cookie共享问题 4.Cooie的特点和作用 5.综合案例 记录上一次访问时间 1.会话技术 1会话:一次会话中包含多次请求和响应。 *一次会话:浏览器第一次给服务器资源发…

新冠确诊阳性后的第二篇博客,一文带你学习文件上传漏洞

新冠确诊阳性后的第二篇博客,一文带你学习文件上传漏洞1.什么是文件上传漏洞2.不要使用黑名单规定上传文件类型3.绕过文件上传检查功能4.Apache文件解析问题5.IIS文件解析问题6.设计安全的文件上传功能1.什么是文件上传漏洞 文件上传漏洞是指用户上传了一个可执行的…

RabbitMQ管理界面

🍁博客主页:👉不会压弯的小飞侠 ✨欢迎关注:👉点赞👍收藏⭐留言✒ ✨系列专栏:👉Linux专栏 🔥欢迎大佬指正,一起学习!一起加油! 目录&…

记录我の秋招之旅【23届 CV算法岗】

文章目录碎碎念春招实习华为实习魔幻秋招尘埃落定碎碎念 今年(2022年)的秋招不能说"非常困难"吧,只能说是"地狱难度",相信参与或者从侧面了解过的同学们也能感同身受。从今年的三月份开始着手秋招,期间也一直忙着实验室…

【基于Transformer和可逆神经网络】

Effective Pan-Sharpening With Transformer and Invertible Neural Network (基于Transformer和可逆神经网络的有效泛锐化) 可逆神经网络1 可逆神经网络2 在遥感成像系统中,全色锐化是从高分辨率全色图像及其对应的低分辨率多光谱图像获得…

30岁之后想转行,可行吗?这20条建议让你少走弯路!

都说三十而立,可眼看着到了意气风发的年龄,却突然意识到自己仍一事无成,甚至连养活自己都是问题。30多岁,大多数人还要开始买房、买车、结婚生子,养家糊口,于是各种压力逼迫之下,就想到了转行&a…

移动硬盘中安装ubuntu系统——Vmware Workstation安装

一. 简介 对于一个程序开发者来说,电脑系统开发环境非常重要。要使用相同的系统环境,可以的方式有:1、携带电脑,2、携带安装了系统的移动硬盘。相比来说,第二种方式更理想,如果是第一种方式携带电脑的话&a…

基于java+springboot的民宿预订信息网站-计算机毕业设计

运行环境 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven 项目介绍 随着国民生…

大学没有学好专业,毕业如何转行?

大学颓废度过,毕业工作一无所长,颠沛流离! 本人17届某二流专科毕业,模具设计与制造专业。其实对模具毫无兴趣,只怪当初没有主见听从没有出过县城的老爸的命令选择了模具这个专业。大学期间上课睡觉玩手机,…

2023年元旦倒计时案例

文章目录基于HTML实现2023年倒计时代码实现基于HTML实现2023年倒计时 代码实现 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>2023倒计时</title> <!-- <link rel"stylesheet" href"sty…

傻白探索Chiplet,Chiplet的通信结构(八)

目录 一、SoC总线结构 二、NoC结构 2.1 NoC层次 2.2 NoC基本组成和属性 2.3 NoC常见的拓扑结构 2.3.1 2D Mesh 2.3.2 2D Torus 2.3.3 3D Mesh 2.3.4 Octagon/Spidergon结构 2.3.5 Cluster Mesh结构 2.3.6 树状结构 2.3.7 蝶状结构 2.4 各种结构之间的比较 2.5 …

网络技术期末复习~基础理论题

问题1.1试述五层协议的网络体系结构的要点&#xff0c;包括各层的主要功能。 解&#xff1a; 物理层&#xff1a;传输比特流。 数据链路层&#xff1a;传送以帧为单位的数据&#xff0c;实现网络中相邻两个节点直接的连接。 网络层&#xff1a;提供主机间的通信服务。&…

【小学信息技术教资面试】《数据计算》教案

1.题目&#xff1a;数据计算 2.内容&#xff1a; 3.基本要求 &#xff08;1&#xff09;掌握公式和函数的使用方法。 &#xff08;2&#xff09;试讲中体现学生的参与性。 &#xff08;3&#xff09;配合板书讲解。 《数据计算》教案 一、教学目标 1.了解公式的组成&#x…

Hadoop综合项目——二手房统计分析(起始篇)

Hadoop综合项目——二手房统计分析&#xff08;起始篇&#xff09; 文章目录Hadoop综合项目——二手房统计分析&#xff08;起始篇&#xff09;0、 写在前面1、项目背景与功能1.1 项目背景1.2 项目功能2、数据集和数据预处理2.1 数据集2.2 数据预处理2.2.1 字段空值处理2.2.2 无…

计算机毕设Python+Vue养生知识平台(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

浅析在线教育行业发展所面临的困境

2013年&#xff0c;在线教育行业悄然兴起&#xff0c;一时间引发讨论。到新冠疫情期间&#xff0c;受到疫情和政策的双重抨击&#xff0c;线下教育行业遭到重创&#xff0c;又有更多人开始关注到并开始看好在线教育。作为技术发展下的产物&#xff0c;在线教育跨越了时间、空间…

【小学信息技术教资面试】《认识Windows程序窗口》教案

1.题目&#xff1a;认识Windows程序窗口 2.内容&#xff1a; 3.基本要求&#xff1a; &#xff08;1&#xff09;学生掌握改变窗口大小和位置的方法。 &#xff08;2&#xff09;教学中注意师生间的交流互动。 &#xff08;3&#xff09;让学生明白Windows窗口组成。 《认识W…