图神经网络并在 TensorFlow 中实现

asokraju.medium.com

一、说明

        本文将引导您了解图神经网络 (GNN) 并使用 TensorFlow 实现该网络。在后续的 文章中,我们讨论 GNN 的不同变体及其实现。这是一个分步计划:

  1. 图神经网络 (GNN) 的使用:我们首先讨论 GNN 是什么、它们如何工作以及它们的使用地点。
  2. 理解图:在深入研究 GNN 之前,了解图的基础知识非常重要,包括节点、边、邻接矩阵和图表示。
  3. 理解图神经网络:我们还将简要介绍神经网络的基础知识,因为 GNN 是神经网络的一种。
  4. 图神经网络 (GNN) 的变体
  5. 使用 TensorFlow 实现 GNN:最后,我们将介绍使用 TensorFlow 实现简单 GNN 的过程。

二、图神经网络 (GNN) 的使用

        图神经网络 (GNN) 是一种神经网络,旨在对图数据结构执行机器学习任务。它们对于数据以图形表示的任务特别有用,例如社交网络、分子结构和推荐系统。

        GNN 的工作原理是将信息从节点传播到其邻居。图中的节点根据其邻居的状态进行更新,并且此过程会重复多次迭代。然后可以使用节点的最终状态进行预测。

        例如,在社交网络中,GNN 可用于根据用户朋友的兴趣来预测用户的兴趣。 GNN 将从每个用户的一些初始表示开始,然后根据其朋友的表示更新每个用户的表示。经过几次迭代后,每个用户的最终表示不仅会捕获他们自己的兴趣,还会捕获他们的朋友、朋友的朋友等的兴趣。

三、理解图表:

        图是一种对对象之间的关系进行建模的数学结构。它由节点(也称为顶点)和组成。节点代表对象,边代表这些对象之间的关系。

        例如,在社交网络中,每个人可以由一个节点表示,每个友谊可以由连接两个节点的边表示。

        有两种主要类型的图表:

  1. 无向图:在无向图中,边没有方向。也就是说,如果存在从节点 A 到节点 B 的边,则也存在从节点 B 到节点 A 的边。 Facebook 友谊就是这样的一个示例:如果人 A 是人 B 的朋友,那么人 B 也是人与 A 是朋友。
  2. 有向图:在有向图中,边确实有方向。也就是说,如果从节点 A 到节点 B 存在一条边,并不一定意味着从节点 B 到节点 A 也存在一条边。 Twitter 关注就是一个例子:如果 A 关注了 B,那么它就会关注 B。并不意味着B跟随A。

        图可以用多种方式表示,但最常见的方式之一是通过邻接矩阵。邻接矩阵是一个方阵,其中第 i 行第 j 列中的条目等于节点 i 和 j 之间的边数。对于无向图,邻接矩阵是对称的。

        另一种常见的表示形式是边列表,其中每条边由一对节点表示。

        了解图的这些基础知识对于理解图神经网络的工作原理至关重要,因为它们直接在图结构上运行。

四、理解图神经网络

GNN 是一种神经网络,旨在对图数据结构执行机器学习任务。它们对于数据以图形表示的任务特别有用,例如社交网络、分子结构和推荐系统。

GNN 背后的关键思想是捕获图中连接之间的依赖关系。他们通过聚合相邻节点的特征来为每个节点生成嵌入来实现这一点。然后,这些嵌入可用于执行各种任务,例如节点分类、链接预测和图分类。

以下是 GNN 工作原理的更详细的分步过程:

  1. 节点特征初始化:图中的每个节点都使用特征向量进行初始化。这可能是节点标签的单热编码、特定于节点的一些实值向量,甚至是零向量。
  2. 特征聚合:每个节点聚合其邻近节点的特征向量以更新自己的特征向量。这通常是使用一个函数来完成的,该函数接收节点及其邻居的特征向量并输出一个新的特征向量。该函数可以是简单平均值、加权和或更复杂的函数。
  3. 特征变换:然后对聚合的特征向量进行变换,通常使用线性变换,然后使用非线性激活函数。这与传统神经网络层中发生的情况类似。
  4. 重复步骤 2 和 3:重复步骤 2 和 3 一定次数的迭代。在每次迭代中,节点都会聚合并转换来自越来越大邻域的特征。
  5. 读出:最终迭代后,使用读出函数聚合图中所有节点的特征向量以产生图级输出。

GNN 的优点在于它们可以处理不同大小和形状的图,并且可以捕获图的局部和全局结构。

五、使用 TensorFlow 实现 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 数据集,这是蛋白质结构的图形分类数据集。

  1. 读出:在最后一层之后,使用读出函数聚合图中所有节点的特征向量以产生图级输出。

现在,让我们看看如何使用 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 的不同变体及其实现。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3-10岁孩子语文能力培养里程碑

文章目录 基础能力3岁4岁5岁6-7岁(1-2年级)8-9岁(3-4年级)10岁(5年级) 阅读推荐&父母执行3岁4-5岁6-7岁(1-2年级)8-9岁(3-4年级)10岁(5年级&a…

1 pandas与NumPy比较

NumPy NumPy是用python进行科学计算的一个基础库,因为它提供python基础包没有提供的数据结构和高性能函数。NumPy定义了一种专门用于科学计算的数据结构ndarray - 它是一种N纬数组。特点如下: 内存块风格 由于ndarray中的所有元素都是相同的&#xff0…

awk 命令详解

1. 编写 awk 脚本基础 1.1 Hello,World 通过演示“Hello,World”这个程序来介绍一种程序设计语言。通过演示这个程序在 awk 中如何工作将证明 awk 是如何的不寻常。实际上,有必要演示几种打印“Hello,World”的不同方法。 在第…

llvm后端之DAG设计

llvm后端之DAG设计 引言1 核心类设计2 类型系统2.1 MVT::SimpleValueType2.2 MVT2.3 EVT 3 节点类型 引言 llvm后端将中端的IR转为有向无环图,即DAG。如下图: 图中黑色箭头为数据依赖;蓝色线和红色线为控制依赖。蓝色表示指令序列化时两个节…

车载V2X方案的选型分享

ACX200T面向 5G车联网C-V2X 应用的安全芯片,满足V2X场景下消息认证的专用安全芯片,该款芯片采用公司自主的 高速硬件加密引擎 ,支 持国家标准SM1、SM2、SM3、SM4密码算法,同时支持国际ECDSA、AES、SHA-1密码算法。可实现网联汽车云…

WT588F34B-16S语音芯片:四通道16K采样率混音播放的应用优势

随着科技的不断进步,语音芯片在电子产品中的应用越来越广泛。其中,WT588F34B-16S语音芯片凭借其卓越的性能和创新的功能,引起了市场的广泛关注。特别是其支持四通道16K采样率混音播放的功能,为实际应用带来了显著的优势。本文将深…

H5聊天系统聊天网站源码 群聊源码 无限建群创群

H5聊天系统聊天网站源码 群聊源码 无限建群创群 1.支持自助建群 管理群 修改群资料 2.支持自动登录 登陆成功可自助修改资料 3.后台可查看群组聊天消息记录 4.支持表情 动态表情 图片发布 5.支持消息语音提醒 测试环境:NginxMySQL5.6PHP5.6 1.将压缩包解压到…

解决:Android 报错 Failed to transform exifinterface-1.2.0.jar

一、问题说明 Failed to transform exifinterface-1.2.0.jar (androidx.exifinterface:exifinterface:1.2.0) to match attributes {artifactTypeandroid-classes-jar, org.gradle.categorylibrary, org.gradle.libraryelementsjar, org.gradle.statusrelease, org.gradle.usa…

excel导出,post还是get请求?

1,前提 今天在解决excel导出的bug时,因为导出接口查询参数较多,所以把原来的get请求接口修改为post请求 原代码: 修改后: 2,修改后 postman请求正常,然后让前端对接口进行同步修改&#xff0…

Kafka消费者组

消费者总体工作流程 Consumer Group(CG):消费者组,由多个consumer组成。形成一个消费者组的条件,是所有消费者的groupid相同。 • 消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费…

打磨 IT 技能、实践全栈开发:Demo 项目之母 RealWorld | 开源日报 No.117

gothinkster/realworld Stars: 75.6k License: MIT RealWorld 是一个令人印象深刻的全栈 Medium.com 克隆应用,由 React、Angular、Node 和 Django 等技术驱动。它展示了如何使用不同的前端和后端来构建相同功能的应用,并且所有实现都遵循相同的 API 规…

【JAVA】重力反弹,反弹高次一次比一次低

本来是想实现泡泡屏保(javascript实现漂亮的气泡碰撞效果(Chrome浏览器下更佳) 下载-脚本之家)的,还未实现 import javax.swing.*; import java.awt.*; import java.util.LinkedList; import java.util.Random;class Bubble {public static Image image;public int…

统计个数并调用--函数设计与实现

#定义函数 count(s) ,统计字符串中小写字母、大写字母、数字的个数,并以字典为结果返回给调用函数。 # (1)判断字符类型 def count(s):#创建字典,用于保存变量dictionary {数字: 0, 小写字母: 0, 大写字母: 0, 其他字符: 0}for c in s:if c.isdigit():d…

EXCEL VLOOKUP函数

参考资料 Excel:史上最全的VLOOKUP应用教程VLOOKUP函数最全面最详细的讲解大全,涵盖17个重要和常见用法! 目录 零. 前提条件一. 单条件查找1.1 顺向查找1.2 逆向查找 二. 多条件查找2.1 顺向查找2.2 逆向查找 三. 根据条件查询等级四. 交差查…

IDEA中如何创建各种类型的java工程

如果你的工程下面的module没有互相依赖,就相当于是一个小的项目,idea版本不同,细节可能不同 1、普通的Java 工程 在工程上,右键- New - Module,如下: 指明Java工程的名称及使用的JDK版本: 创建…

Hive入门+部署

看黑马视频做的笔记 目录 概念 1.基本概述 2.基础架构 总架构 部署 1.安装MySQL 2.配置Hadoop 3.下载解压Hive 4.下载MySQL Driver包 注意! 5.配置Hive 6.初始化元数据库 7.启动Hive(使用Hadoop用户) 实例 查看HDFS上表中存…

Redis内存策略

1.Redis中Key的过期策略 问题1:Redis是如何知道一个key是否过期呢? Redis会利用两个字典分别记录key-value对(dict)以及key-ttl对(expires)。 1.1 立即删除 在设置键的过期时间时,会创建一个回…

JVM垃圾收集器三色标记算法

垃圾收集算法 分代收集理论 当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。 比…

RK3568平台 PWM Backlight控制背光亮度

一.PWM基本概念 以单片机为例,我们知道,单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平。 假设高电平为5V 低电平则为0V 那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获…

【小沐学Unity3d】3ds Max 减面工具汇总

文章目录 1、简介2、“优化”修改器3、“专业优化”修改器4、“多分辨率”修改器5、Polygon Cruncher5.1 工具简介5.2 下载安装5.3 使用测试 6、Simplyon6.1 工具简介6.2 下载安装6.3 使用测试 7、FAQ7.1 在3dmax里面显示点数和面数 结语 1、简介 有几个 3ds Max 修改器可帮助您…