1.PyTorch Geometric(PyG)简易记录
2.PyTorch Geometric教程(一)介绍
3.GCN图卷积节点分类模型代码(Pytorch)
4.Graph Convolution Network 理解与实现
5.如何使用PyTorch Geometric
6.图神经网络 PyTorch Geometric 入门教程
PyTorch Geometric(PyG)简易记录
PyTorch Geometric(PyG)是一个基于PyTorch的库,旨在提供图神经网络(GNN)的构建和训练功能。它支持多种与图数据相关的关键功能。
加载图数据时,以Cora数据集为例,展示了数据加载的八爷源码讨论过程。Cora数据集是图神经网络领域中的经典数据集,主要用于节点分类任务,代表了一个引文网络,节点为论文,边表示论文之间的引用关系。节点特征是论文的词袋描述,类别表示论文类型,共分为7类。
Cora数据集以PyG中的类形式呈现,包含单张图,节点数为,边数为,节点特征维度为。重要的是边表示方法,edge_index用于描述边,通过PyG函数转换成稀疏矩阵,展示为×的矩阵。
可视化图数据时,通常使用networkx与matplotlib工具。网络图中,大部分节点以蓝色显示,相互关联,周围则为孤立节点。
PyG实现GCN(简易版)主要通过调用库中的接口完成。值得注意的是,PyG内部结构不使用邻接矩阵torch.SparseTensor,而是通过edge_index和edge_weight进行计算。
在矩阵形式实现GCN(简易版)中,给定图的邻接矩阵和节点特征矩阵,使用矩阵表示GCN层中的参数和隐藏层特征。通常,GCN层的操作表达式为 [公式],其中 [公式] 表示参数, [公式] 表示隐藏层特征。
定义GCN层和模型结构,例如两层GCN,以Cora数据集为例进行简要使用。首先对邻接矩阵进行标准化,使用公式进行表示。
PyTorch Geometric教程(一)介绍
为什么选择图神经网络(GNN)?在组合优化中,路由问题,特别是旅行商人问题,这类问题的数据结构本身是图结构。在构建和求解上,指标源码 2018GNN似乎具有天然的优势。目前GNN非常热门,其中两个库最热门:Deep Graph Library(DGL)和PyTorch Geometric(PyG)。这两个库都很好用,差别不大(DGL官网有中文教程)。但是PyG相对来说更基础一些,教程与支持也更多一些。因此作者打算在自我学习之余,翻译、理解并整理官方的英文教程。如有错误或疑问,欢迎留言或私信讨论。
下载并引入库GNN介绍
图神经网络旨在将经典深度学习概念推广到非常规(与图像或文字不同的)数据结构,使神经网络能够对研究对象及其关系进行推理。例如,我们可以使用一个简单的神经消息传递架构来实现这一需求。在某个图中 [公式],所有节点 [公式] 的特征向量 [公式] 都会被从它们的邻居节点 (neighbors) [公式] 聚集 (aggregate) 本地信息,进行迭代地更新:
[公式]
输出结果:
在初始化KarateClub数据集之后,我们可以检查它的一些属性。例如,我们可以看到这个数据集只有一张图,并且每个节点都有一个维的特征向量(用来唯一描述Karate俱乐部的每个成员)。另外,这张图只有4个类别,这代表每个节点所属的社区。现在让我们看看这个图的更多细节:
输出结果:
在PyG内,每张图都由某个Data对象表示,该对象拥有所有描述图表达(graph representation)的信息。不难发现,这个data对象拥有4个属性:
总的来说,我们只知道4个节点的真实(ground-truth)标签,我们的任务是推断剩余节点的社区分配。data对象也提供一些便利函数来推断一些图下基础属性。比如,我们可以轻易判断在图中是否存在孤立节点,也就是其与任意其他节点都没有边相连。又或者是这个图是否包含自循环(self-loop),数学上我们可以表示为 [公式]。还有是否这是个无向图,也就是对每条边 [公式],同样存在 [公式]。让我们接下来检查一下edge_index的属性:
输出结果:
通过打印出edge_index,我们就可以理解PyG是怎样在内部表达图连接性的了。我们可以看到对于每条边,edge_index都拥有两个索引的元组(tuple),其中第一个值是源节点的索引,而第二个值则是对应边的目标节点的索引。
这种表达也被叫做COO格式(coordinate format),日记管理源码它通常被用作表达稀疏矩阵。与在密集表达内持有邻接信息[公式]不同,PyG稀疏地表达图,也就是只持有[公式]里非零的坐标或值。而且,PyG并不区分有向和无向图,它将无向图视作有向图的一个特例。我们可以将这个图转化为networkx库格式,来可视化它:
输出结果:
在学习PyG如何处理数据之后,现在该实现第一个我们的GNN了!让我们使用最简单的GNN运算器之一,GCN layer[1]定义为:
[公式]
其中[公式]代表一个可训练的权重矩阵,大小为[num_output_features, num_input_features],而[公式]指的是每条边的固定的归一化系数。PyG通过GCNConv来实现这一次层,GCNConv的输入为节点特征表达x和COO图连接性表达edge_index。与常规的PyTorch神经网络结构相似,可以通过定义一个torch.nn.Module类来构建我们的第一个图神经网络:
输出结果:
在这里,我们首先在__init__里初始化构建模块,并在forward里定义计算流程。我们首先定义并堆积3图卷积层,其对应聚集每个节点周围3-hop的邻居信息(也就是说所有节点最多距离三次“跳跃”这么远)。另外,GCNConv层减少节点特征维度至2,也就是[num_output_features]。注意,每GCNConv层都被tanh非线性函数增强。
之后,我们应用单层线性变换(linear transformation)torch.nn.Linear作为分类器,将节点映射到4个类或社区中的一个。最后,我们同时返回最终分类器的输出和GNN产生的最终的节点嵌入(node embeddings)。
嵌入Karate俱乐部网络
让我们来看看GNN产生的节点嵌入。在这里,我们传递初始节点特征x和图连接性信息edge_index到模型中,并可视化它的2维嵌入。
输出结果:
值得注意的是,即使在训练模型权重之前,该模型也产生了与图的社区结构非常相似的节点嵌入。相同颜色的节点代表它们所属社区相同。虽然我们的模型权重是完全随机初始化的,而且到目前为止我们还没有进行任何训练,我们仍然可以观察到这些节点已经在嵌入空间中被聚类(cluster)了。因此,我们可以得出结论,GNN引入了很强的诱导偏差(inductive bias),这些偏差导致输入图中彼此想接近的节点出现类似的嵌入。
在Karate俱乐部网络上训练
当然我们可以做得更好,既然我们模型中的框架jsp源码所有东西都是可微分的且参数化的,我们可以添加一些标签来训练这个模型,并观测嵌入是如何反应的。在这里,我们利用半监督(semi-supervised),或者叫直推学习(transductive learning)过程:我们只针对每个类的一个节点进行训练,但允许使用完整的图数据输入。
训练过程也与大部分PyTorch常规模型相似。除了定义网络架构,我们还需要定义一个损失标准(loss criterion),在这里我们使用CrossEntropyLoss,并初始化一个随机梯度优化器(stochastic gradient optimizer),我们用Adam。之后,我们执行多次优化,每轮包含一个前向和后向传播,以此来计算从前向传播推导出的模型参数。如果你并不熟悉PyTorch,请移步至官方教程a good introduction on how to train a neural network in PyTorch。
现在,我们的半监督场景是由下面的函数获得:
当我们为所有节点计算节点嵌入时,我们只用训练节点来计算损失。在这里,我们筛选出分类器的输出out和真实标签data.y来包含在train_mask里的节点。让我们看看代码是什么:
输出结果:
不难发现,我们的3层GCN模型成功地区分了社区(线性的),并准确地分类了大部分的节点。
GCN图卷积节点分类模型代码(Pytorch)
GCN,全称图卷积网络,是一种在图数据上进行特征提取的强大工具。它在深度学习中,尤其是图神经网络中扮演着关键角色,通过在图上进行类似于卷积操作,捕捉节点间的局部结构信息。对于GCN的理解,可以参考小虎AI珏爷的通俗讲解,链接:[plt.show](/pyg-team/pytorch_geometric)。
PyTorch Geometric (PyG) 是一个强大的图神经网络库,基于PyTorch构建,提供了许多GNN模型实现和常用数据集。其简洁的接口使得复现论文变得轻松,对于熟悉PyTorch的开发者来说,上手非常迅速。PyG支持的数据集如TUDATASET,包含超过个数据集,包括小分子、生物信息学数据如DD, ENZYMES和PROTEINS等,它们分别代表了分子结构分类和蛋白质功能预测等任务。
构建GCN模型时,通常会使用PyG提供的简单会员源码现成模块,如3层卷积用于节点分类,图同构网络则可能包括均值池操作。目标是通过负对数似然损失函数进行分类。PyG的GCNConv和GINConv是消息传递的实例,它们在图卷积层中发挥核心作用。
在训练阶段,模型通过前向传播计算预测标签分布,随后反向传播误差。对于节点分类,通常会划分子集作为训练和测试节点,批处理时屏蔽测试节点。图分类则采用%数据进行训练,剩余%用于测试。
为了验证模型性能,可以使用TensorBoardX观察模型的loss和精度变化。比如,可以查看ENZYMES数据集的图网络分类结果,或在Citeser引文网络上执行节点分类任务。同时,GNN的隐藏层表示也具有可视化价值,通过TSNE将节点嵌入空间展示,颜色编码标签,反映出模型学习到了有意义的表示。
无监督的节点嵌入学习可以通过Graph自编码器实现,编码器使用图卷积层,训练过程中无需标签信息,仅依赖于网络结构本身。训练后的嵌入通过TSNE可视化,模型能在无标签的情况下捕捉到社区结构,显示了其在无监督学习中的潜力。
想深入了解GCN资料,可以关注小虎AI珏爷的微信公众号,输入“[GCN]”获取更多资源。
Graph Convolution Network 理解与实现
Graph Convolution Network (GCN) 是图结构网络的简单分支,理解 GCN 能够帮助我们理解更复杂的图结构网络,如场景图生成中的消息传递机制。GCN 的关键在于它将节点间的边定义为给定的边集或邻接矩阵,与传统的 CNN 相比,其在更新节点特征时使用统一的参数。
传统 CNN 的输入图像可以看作一个图,其中像素集合为节点,像素之间的连接定义了边,每个像素有最多 8 个相邻的像素与之相连。CNN 的卷积操作通过将相邻像素及其自身的特征与可学习的参数化内核相乘来更新像素特征。
GCN 的操作类似于 CNN 的卷积,但有所不同,主要体现在边的定义方式和特征更新方法上。GCN 使用给定的边集来定义节点间的连接,且每个节点的特征更新通过同一套参数进行,而非基于像素之间的特定连通性。
GCN 的数学公式如下所示:
节点输入 X 与邻接矩阵 A 通过一个可学习参数 W 相乘,再与一个对角矩阵 D 相乘(D 的元素表示节点的邻居数量),从而获得节点特征的更新。
为了简化 GCN 的实现,可以使用 GRU 或 LSTM 等循环神经网络单元来更新节点特征,并引入图级特征,这有助于将整个图整合为一个特征。
在某些情况下,为了提取图级特征,可以使用如下公式:
这些公式允许将整个图表示为一个特征向量,为后续的处理提供基础。
关于 Gated Graph Convolution Network 的具体实现,可以参考开源项目 KaihuaTang/GGNN-for-bAbI-dataset.pytorch.1.0,该项目提供了基于 Gated Graph Convolution Network 的代码实例。
参考资料:
[1] Relational inductive biases, deep learning, and graph networks,
[2] Semi-Supervised Classification with Graph Convolutional Networks,
[3] Gated Graph Sequene Neural Networks, ICLR,
如何使用PyTorch Geometric
在深度学习领域中,处理图数据成为了一个重要挑战,因为图数据是非结构化的,形态各异,PyTorch Geometric 库正是为了解决这一问题而生。它是一个基于 PyTorch 的图网络处理库,为图网络的处理提供了基础结构。
当处理一个单个的图时,我们使用 torch_geometric.data.Data 来描述,它包含了多个关键属性,如节点特征(data.x)、图的连接情况(data.edge_index)、边的特征(data.edge_attr)、目标值(data.y)以及节点位置(data.pos)。每个属性的形状各有不同,以适应数据的不同维度和需求。
例如,ShapeNet 数据集包含 , 个 3D 形状的点云,每点被分为 类,我们可以通过 torch_geometric.datasets 直接接入这些点云数据。接着,我们利用 geometric 的数据转换接口将点云数据转换为图的形式,使得数据的形状符合我们定义的结构。
接下来,让我们实现一个两层的图卷积网络(GCN)来处理这些图数据。首先,我们回顾 GCN 的基本概念,理解如何在深度学习中使用 GCN。然后,我们将动手建立一个简单的两层 GCN 模型,包括前向传播和反向传播的步骤。最后,我们将实现一个简单的准确度测试代码,以评估模型在图数据上的表现。
通过上述介绍,您已经了解了如何使用 PyTorch Geometric 库来处理图数据,从数据的准备到模型的构建和测试。掌握这些技能,将有助于您在处理各种结构化和非结构化数据时,更好地应用深度学习技术。
图神经网络 PyTorch Geometric 入门教程
图神经网络(GNN)近年来在学术界得到了广泛关注,尤其由于其能够处理不规则输入的能力。GNN 通过信息传递、转换和聚合来提取特征,类似于卷积神经网络(CNN),但 GNN 可以处理点云等不规则输入,而 CNN 仅适用于固定尺寸的输入,如。
PyTorch Geometric(PyG)是一个基于 PyTorch 的图神经网络库,提供了一套方便复现论文方法的实现和常用数据集,使得使用 GNN 变得更加简单。它的用法与 PyTorch 类似,因此对于熟悉 PyTorch 的用户而言,可以快速上手。
在 PyG 中,构建图需要两个关键要素:节点和边。通过使用 `torch_geometric.data.Data` 类,可以定义图的结构,该类提供了五个属性,每个属性并非必须,可以为空。进一步地,`Data` 对象不限于这些属性,还可以通过 `data.face` 属性扩展,用张量保存三维网格中三角形的连接信息。
值得注意的是,在 `Data` 对象中包含了样本的标签,这与 PyTorch 稍有不同。在 PyTorch 中,通过重写 `Dataset` 的 `__getitem__()` 方法根据索引返回样本和标签。而在 PyG 中,使用 `get()` 函数根据索引返回 `torch_geometric.data.Data` 类型的数据,其中包含了数据和标签。
下面是一个未加权无向图的例子,包括3个节点和4条边。由于是无向图,边的表示方式为 `(0 -> 1)`、`(1 -> 0)`、`(1 -> 2)` 和 `(2 -> 1)`。每个节点都有自己的特征。这个图可以使用 `torch_geometric.data.Data` 类表示如下。在边的表示中,`edge_index` 由两个列表构成,分别表示边的起始点和目标节点。
对于 `edge_index` 的存储,通常需要先转置然后使用 `contiguous()` 方法。关于 `contiguous()` 函数的作用,可以查阅 PyTorch 文档。
综上所述,`Data` 对象的基本属性包括 `x`(节点特征)、`edge_index`(边的索引)、`pos`(节点位置)和 `y`(样本标签)。在构建 Dataset 时,可以使用 PyG 提供的工具,如 `TUDataset`,通过简单的代码加载数据集,并通过索引访问每个数据。
在 PyG 中,通过 `Dataset` 和 `DataLoader` 进行数据管理和并行处理,其中 `DataLoader` 可以方便地使用 mini-batch。`torch_geometric.data.Dataset` 继承自 `torch.utils.data.Dataset`,提供了数据集管理和预处理的功能。
为了自定义数据集,可以继承 `torch_geometric.data.Dataset` 类,实现数据加载、预处理和数据转换。在初始化方法中,需要传入数据存放的路径,并通过 `pre_transform` 和 `pre_filter` 方法对数据进行预处理。`process()` 方法用于生成处理后的数据,通常将原始数据转换为 `pt` 格式,以便在 `get()` 方法中使用 `torch.load()` 函数加载。
数据增强是计算机视觉领域常见的实践,PyG 提供了专门的 `transforms`,可以对输入数据进行变换,如生成最近邻图或在点坐标上随机平移等操作。通过 `torch_geometric.transforms.Compose` 可以封装一系列的 `transforms`。
在模型训练方面,可以使用 PyG 提供的工具构建和训练 GNN 模型。例如,使用简单的 GCN 层在 Cora 数据集上进行实验。通过加载数据集、定义模型结构、训练模型和评估模型性能,可以完成基本的 GNN 模型训练过程。
总之,PyTorch Geometric 提供了构建和训练图神经网络的强大框架,包括图数据结构处理、数据集管理和模型训练工具,使得 GNN 应用更加便捷和高效。
PyTorch Geometric 教程(不断更新中)
PyTorch Geometric,一个专为图神经网络设计的扩展库,简化了在深度学习框架PyTorch中实现图神经网络的复杂度。
要安装PyTorch Geometric,请首先查看您的PyTorch版本。随后,访问PyTorch Geometric的官网获取安装命令。
使用可视化函数,可以轻松地以CSW-Colab0教程的方式对数据进行可视化。PyTorch Geometric通过torch_geometric.datasets提供了多种数据集,如KarateClub数据集。初始化KarateClub数据集后,可以检查其属性,如节点数量、特征维度和类别。
每个图在PyTorch Geometric中都由一个Data对象表示,包含图表示的所有信息。通过print(data)可查看其属性和形状概览。数据对象包含四个属性,同时提供检查孤立节点、自环节点和图是否为无向图等操作。
边索引在PyG内部以COO格式表示图的连通性,其中edge_index记录了源节点和目的节点的节点索引。将图形转换为networkx库格式可以进一步实现强大的可视化工具。
为了实现第一个图神经网络,使用GCN层并利用PyG中的GCNConv。在torch.nn.Module类中定义网络架构,包括三个图卷积层聚合节点周围的信息。每个GCNConv层通过tanh非线性增强,最后应用线性变换作为分类器。
值得注意的是,即使模型的权重初始化为随机值,GCN也能生成与图社区结构相似的节点嵌入,体现了很强的归纳偏差。
在Karate Club数据集上进行训练,使用半监督学习过程。通过定义网络架构、损失标准(如CrossEntropyLoss)和优化器(如Adam),进行多轮优化以训练模型参数。过滤分类器输出和真实标签,仅使用训练节点计算损失。
训练后,节点嵌入随时间逐渐演化,显示3层GCN模型能够线性地分离社区并对大多数节点进行正确分类。PyTorch Geometric库简化了数据处理和GNN实现,使得仅用几行代码即可完成。
torch_geometric详细安装教程
需要用到GNN的小伙伴一定会需要用到torch_geometric包,这样会极大减轻我们工作量,一个GCNConv只需一行代码就能轻松调用,下面详细介绍torch_geometric包的安装过程。
1.环境+版本检查
首先检查自己使用的虚拟环境是哪一个,确保我们可以能正常的将这个包装到虚拟环境中正常调用。我的虚拟环境是Pytorch,如图1。
其次要检查自己虚拟环境中已安装的pytoch版本,安装的pytorch是cpu还是gpu的,以及cuda版本等等,操作命令如下代码。
比如我这里依次显示的是
ps:想要查看自己的python版本,可按如下操作步骤。
激活自己的虚拟环境,然后输入python即可。我这里的python版本是3.7.1。
2.下载必要的依赖
去GitHub的pyg-team主页中找到pytorch-geometric包。网址如下:
然后点击图3中的 here,跳转链接。
之后会弹到新的界面,如图4。这里就需要第一步中得到的torch版本,cuda版本选择对应的点击。对应我自己的就是选择的图中灰色的torch-1.7.0+cu。(表示pytorch是1.7.0版本,cuda是.1版本)
点击之后又会出现新的界面,如图5。一共有四种依赖,分别是torch_scatter,torch_sparse,torch_cluster,torch_spline_conv。每一种下载其中一个即可(torch_scatter-1.5.8表示torch_scatter版本号,cp表示python3.7,win表示Windows操作系统,根据自己电脑种实际情况去选择安装)。单击后就会下载whl类型的文件。我这里下载后的文件如图6所示。
3.安装依赖
打开虚拟环境,进入到上述四个依赖的安装目录下,操作方式见图7。
然后依次进行安装,按照以下顺序执行命令(要看准自己的版本号):
先安装torch_scatter
第二步安装torch_sparse
第三步安装torch_cluster
第四步安装torch_spline_conv
第五步安装torch_geometric。如果开着梯子需要把梯子关掉!这一步也可以指定torch_geometric的版本安装,如pip install torch_geometric==2.0.4 -i pypi.doubanio.com/simpl...
4.测试
在pycharm种输入import torch_geometric,没有显示报错即为安装成功。
5.备注
针对这篇文章,我在B站发布了一个教程视频,欢迎参考: pytorch_geometric详细安装教程_哔哩哔哩_bilibili
安装后可能会遇到两个运行报错问题(亲身经历):
(1)报错提示:ModuleNotFoundError: No module named 'torch.profiler'
请参考我的文章: MFBZS:ModuleNotFoundError: No module named 'torch.profiler'?
(2)报错提示:AttributeError: module 'torch' has no attribute "'sparse_csr'"
请参考我的文章: MFBZS:AttributeError: module 'torch' has no attribute "'sparse_csr'"