????????本文将引导您了解图神经网络 (GNN) 并使用 TensorFlow 实现该网络。在后续的?文章中,我们讨论 GNN 的不同变体及其实现。这是一个分步计划:
????????图神经网络 (GNN)?是一种神经网络,旨在对图数据结构执行机器学习任务。它们对于数据以图形表示的任务特别有用,例如社交网络、分子结构和推荐系统。
????????GNN 的工作原理是将信息从节点传播到其邻居。图中的节点根据其邻居的状态进行更新,并且此过程会重复多次迭代。然后可以使用节点的最终状态进行预测。
????????例如,在社交网络中,GNN 可用于根据用户朋友的兴趣来预测用户的兴趣。 GNN 将从每个用户的一些初始表示开始,然后根据其朋友的表示更新每个用户的表示。经过几次迭代后,每个用户的最终表示不仅会捕获他们自己的兴趣,还会捕获他们的朋友、朋友的朋友等的兴趣。
????????图是一种对对象之间的关系进行建模的数学结构。它由节点(也称为顶点)和边组成。节点代表对象,边代表这些对象之间的关系。
????????例如,在社交网络中,每个人可以由一个节点表示,每个友谊可以由连接两个节点的边表示。
????????有两种主要类型的图表:
????????图可以用多种方式表示,但最常见的方式之一是通过邻接矩阵。邻接矩阵是一个方阵,其中第 i 行第 j 列中的条目等于节点 i 和 j 之间的边数。对于无向图,邻接矩阵是对称的。
????????另一种常见的表示形式是边列表,其中每条边由一对节点表示。
????????了解图的这些基础知识对于理解图神经网络的工作原理至关重要,因为它们直接在图结构上运行。
GNN 是一种神经网络,旨在对图数据结构执行机器学习任务。它们对于数据以图形表示的任务特别有用,例如社交网络、分子结构和推荐系统。
GNN 背后的关键思想是捕获图中连接之间的依赖关系。他们通过聚合相邻节点的特征来为每个节点生成嵌入来实现这一点。然后,这些嵌入可用于执行各种任务,例如节点分类、链接预测和图分类。
以下是 GNN 工作原理的更详细的分步过程:
GNN 的优点在于它们可以处理不同大小和形状的图,并且可以捕获图的局部和全局结构。
有几个构建在 TensorFlow 之上的库提供了各种类型的 GNN 的实现,例如 Graph Nets 和 Spektral。我们可以使用这些库之一来简化实现过程。
首先,您需要安装 Spektral 库。您可以使用 pip 执行此操作:
pip install spektral
安装 Spektral 后,您可以首先导入必要的库:
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Dropout
from spektral.layers import GCNConv, global_sum_pool
from spektral.data import DisjointLoader, Dataset
from spektral.datasets import TUDataset
在此示例中,我们将使用 TUDataset,它是用于图分类的基准数据集的集合。
接下来,让我们加载数据集:
dataset = TUDataset('PROTEINS')
这将下载 PROTEINS 数据集,这是蛋白质结构的图形分类数据集。
现在,让我们看看如何使用 TensorFlow 中的 Spektral 库实现一个简单的 GraphSAGE 模型:
import spektral
from spektral.layers import GraphSageConv
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dropout, Dense
# Define the model
class GraphSageModel(Model):
def __init__(self, n_hidden, n_labels):
super().__init__()
self.sage_conv1 = GraphSageConv(n_hidden)
self.sage_conv2 = GraphSageConv(n_labels)
self.dropout = Dropout(0.5)
self.dense = Dense(n_labels, 'softmax')
def call(self, inputs, training=False):
x, a = inputs
x = self.dropout(x, training=training)
x = self.sage_conv1([x, a])
x = self.sage_conv2([x, a])
return self.dense(x)
# Instantiate the model
model = GraphSageModel(n_hidden=64, n_labels=dataset.n_labels)
该模型将由其节点特征表示的图作为输入x
、邻接矩阵a
和批次索引i
.该模型首先对节点特征应用 dropout,然后应用两个图卷积层,将节点特征池化为图级表示,最后应用密集层来预测每个图的类别。
接下来,让我们编译并训练我们的模型:
model = GNN(n_hidden=64, n_labels=dataset.n_labels)
model.compile('adam', 'categorical_crossentropy', ['acc'])
loader = DisjointLoader(dataset, batch_size=32, epochs=10)
model.fit(loader.load(), steps_per_epoch=loader.steps_per_epoch)
什么是
global_sum_pool represent?
在图神经网络(GNN)的背景下,池化是一种用于将整个图的信息聚合成单个向量表示的技术。这对于图级预测任务特别有用,我们想要对整个图(而不是单个节点或边)进行预测。
global_sum_pool
是 Spektral 库提供的一种此类池化操作。顾名思义,它只是将图中所有节点的特征向量相加以生成单个向量。此操作对于图中节点的顺序是不变的,这对于许多基于图的任务来说是一个重要属性。值得注意的是,求和池化是一种非常简单的池化操作,GNN 中还可以使用许多其他更复杂的池化操作,例如均值池化、最大池化以及更复杂的方法,例如图注意力池化和图同构池化。池化操作的选择会对 GNN 的性能产生重大影响,而最佳选择通常取决于具体的任务和数据。
i
?表示 x = self.pool(x, i) 是什么?函数调用中的
i
表示每个节点的批次索引。global_sum_pool(x, i)
当您在批量设置中处理图形数据(即单个批次中的多个图形)时,您需要一种方法来指示哪些节点属于哪些图形。这是因为与图像或文本数据不同,批次中的图可以具有不同的大小(即不同数量的节点和边),因此不能简单地将它们堆叠在单个张量中。
批次索引
i
?是一个向量,它将每个节点分配给批次中的特定图。例如,如果批次中有两个图表,第一个有 3 个节点,第二个有 2 个节点,则批次索引?i
?将为?[0, 0, 0, 1, 1]
。这表明前三个节点属于第一个图,最后两个节点属于第二个图。
在后续文章中,我们讨论 GNN 的不同变体及其实现。