图神经网络入门

news2024/9/27 12:18:23

图神经网络(GNN)是一组在图领域工作的深度学习方法。 这些网络最近已应用于多个领域,包括: 组合优化、推荐系统、计算机视觉—仅举几例。 这些网络还可用于对大型系统进行建模,例如社交网络、蛋白质-蛋白质相互作用网络、知识图以及其他研究领域。 与图像等其他数据不同,图形数据在非欧几里得空间中工作。 因此,图分析的目标是节点分类、链接预测和聚类。

在本文中,我们将进一步探讨图神经网络(GNN)。

1、什么是图?

图(Graph)是包含节点和顶点的数据结构。 各个节点之间的关系由顶点定义。 如果在节点中指定了方向,则该图被称为有向图,否则,该图是无向图。

使用图表的一个很好的例子是对社交网络中不同人之间的联系进行建模。

2、图神经网络

图神经网络(GNN:Graph Neural Network)是一类特殊的神经网络,能够处理以图形形式表示的数据。 这些网络很大程度上受到卷积神经网络(CNN)和图嵌入的推动。 CNN 无法处理图数据,因为图中的节点不以任何顺序表示,而且两个节点之间的依赖信息由边表示。

3、使用 NetworkX处理图数据

让我们花一点时间看看如何使用 NetworkX处理图数据。 NetworkX 是一个可用于创建图的 Python 包。 以下是如何使用该包创建没有节点的空图:

import networkx as nx
G = nx.Graph()

然后,你可以使用 add_nodes函数向图中添加一些节点:

G.add_nodes_from([2, 3])

接下来,使用 add_edges_from函数向图中添加一些边:

edges = [(2,1),(2,2),(3,2),(4,3),(6,4),(7,5),(14,5)]
G.add_edges_from(edges)

可以使用 Matplotlib 可视化这个图。 这是通过调用 draw函数并使用 Matpotlib 显示图形来完成的。

nx.draw(G, with_labels=True, font_weight='bold')
import matplotlib.pyplot as plt
plt.show()

4、图神经网络如何工作?

图神经网络(GNN)的概念由 Franco Scarselli Bruna 等人于 2009 年首次提出。在他们名为“图神经网络模型”的论文中,他们提出了现有神经网络的扩展,用于处理以图结构表示的数据。 该模型可以处理非循环图、循环图、有向图和无向图。 GNN 的目标是学习封装每个节点邻域信息的状态嵌入。 该嵌入用于产生输出。 例如,输出可以是节点标签。

最初的 GNN 提案有一些限制:

  • 对于固定点来说,节点隐藏状态的更新效率低下
  • GNN 在每次迭代中使用相同的参数,而其他神经网络在每层中使用不同的参数
  • 对从边获得的信息特征进行建模很困难

5、传统的图分析方法

也可以使用传统方法来分析图表。 这些方法通常是算法,包括:

  • 最短路径算法,例如 Dijkstra 算法
  • 搜索算法,例如广度优先搜索算法
  • 生成树算法,例如 Prim 算法

这些方法的挑战是需要先验知识,因此它们不能用于图分类。

6、图神经网络的类型

图神经网络有多种类型。 让我们看一下其中的几个。

6.1 图卷积网络 (GCN)

图卷积网络 (GCN) 使用与普通卷积神经网络相同的卷积运算。 GCN 通过检查相邻节点来学习特征。 它们通常由图卷积、线性层和非线性激活组成。 GNN 的工作原理是聚合邻域中的向量,将结果传递到密集的神经网络层,最后应用非线性。

GNN 与 CNN 的不同之处在于,它们是为处理非欧几里德结构化数据而构建的。 GCN 主要有两种类型:

  • 空间卷积网络。 在这些网络中,相邻节点的特征被组合成中心节点。 特征的求和类似于普通的卷积运算。
  • 谱卷积网络:在谱网络中,卷积运算是通过计算在傅里叶域中定义的拉普拉斯特征分解完成。

6.2 图自动编码器网络

图自动编码器网络(GAE:Graph Auto-Encoder Networks)由编码器和解码器组成。 这两个网络通过瓶颈层连接起来。 编码通过使图特征通过卷积滤波器来获取图像特征。 解码器尝试重建输入。 众所周知,自动编码器模型可以处理链接预测问题中常见的极端类别不平衡问题。 因此,图自动编码器网络尝试学习图表示,然后使用解码器重新构建图。

6.3 图循环神经网络

图循环神经网络 (GRNN:Graph Recurrent Neural Network) 利用多关系图并使用基于图的正则化器来提高平滑度并减轻过度参数化。 由于邻域的确切大小并不总是已知,因此使用循环 GNN 层使网络更加灵活。 GRNN 可以学习适合数据的最佳扩散模式。 它还能够处理节点涉及多个关系的情况。 该网络的计算成本也很低,因为操作数量根据图边的数量线性缩放。

6.4 门控图神经网络(GGNN)

在具有长期依赖性的问题上,门控图神经网络(GGNN:Gated Graph Neural Network)比循环图神经网络表现更好。 长期依赖关系由节点和边缘门编码。 长期时间依赖性由时间门编码。 因此,门控图神经网络通过添加门控机制来改进循环图神经网络。 这些门负责不同状态下的信息记忆和遗忘。

7、GNN 应用列表

现在让我们花点时间看看 GNN 可以做什么:

  • 节点分类:这里的目标是通过考虑邻居的标签来预测节点的标签。
  • 链接预测:在这种情况下,目标是预测图中各个实体之间的关系。 例如,这可以应用于社交网络的预测连接。
  • 图聚类:这涉及将图的节点划分为簇。 可以基于边权重或边距离或通过将图视为对象并将相似对象分组在一起来完成划分。
  • 图分类:这需要将图分类为类别。 这可以应用于社交网络分析和自然语言处理中的文档分类。 NLP 中的其他应用包括文本分类、提取文本之间的语义关系和序列标记。
  • 计算机视觉:在计算机视觉领域,GNN 可用于生成目标检测的感兴趣区域。 它们还可以用于图像分类,从而生成场景图。 然后场景生成模型识别图像中的对象以及它们之间的语义关系。 该领域的其他应用包括交互检测和区域分类。

8、与 GNN 相关的问题

图神经网络是强大的网络。 然而,有一些与它们相关的已知问题:

  • 本质上是浅层的:传统的神经网络可以非常深入以获得更好的性能。 不幸的是,GNN 通常很浅,大多数只有三层。 深度 GNN 的创建仍然是一个活跃的研究领域。
  • 动态图:动态图的结构不断变化,因此难以建模。 动态 GNN 也是一个活跃的研究领域。
  • 缺乏标准的图生成方法:没有标准的图生成方法。 在某些应用程序中,使用完全连接的图,而在其他应用程序中,算法检测图节点。
  • 可扩展性:将 GNN 大规模应用于推荐系统和社交网络等应用中是一个挑战。 这里的主要障碍是这些方法的计算成本很高。

9、示例:使用 PyTorch 构建图神经网络

PyTorch 可以与 DGL 结合构建用于节点预测的图神经网络。 深度图库 (DGL) 是一个 Python 包,可用于通过 PyTorch 和 TensorFlow 实现 GNN。 官方文档提供了有关如何入门的示例。

让我们看一个 PyTorch 示例,展示如何在 Cora 数据集上为半监督节点分类模型构建 GNN。第一步是导入包并加载数据:

import dgl
import torch
import torch.nn as nn
import torch.nn.functional as F
import dgl.data
dataset = dgl.data.CoraGraphDataset()
g = dataset[0]

下一步是定义图卷积网络,该网络将使用邻域信息计算节点表示。 这是使用 dgl.nn.GraphConv完成的:

from dgl.nn import GraphConv
class GCN(nn.Module):
    def __init__(self, in_feats, h_feats, num_classes):
        super(GCN, self).__init__()
        self.conv1 = GraphConv(in_feats, h_feats)
        self.conv2 = GraphConv(h_feats, num_classes)

    def forward(self, g, in_feat):
        h = self.conv1(g, in_feat)
        h = F.relu(h)
        h = self.conv2(g, h)
        return h
# Create the model with given dimensions
model = GCN(g.ndata['feat'].shape[1], 16, dataset.num_classes)

下一步是训练神经网络。 训练的方式与在 PyTorch 或 TensorFlow 中进行训练的方式类似:

def train(g, model):
    optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
    best_val_acc = 0
    best_test_acc = 0

    features = g.ndata['feat']
    labels = g.ndata['label']
    train_mask = g.ndata['train_mask']
    val_mask = g.ndata['val_mask']
    test_mask = g.ndata['test_mask']
    for e in range(100):
        # Forward
        logits = model(g, features)

        # Compute prediction
        pred = logits.argmax(1)

        # Compute loss
        # Note that you should only compute the losses of the nodes in the training set.
        loss = F.cross_entropy(logits[train_mask], labels[train_mask])

        # Compute accuracy on training/validation/test
        train_acc = (pred[train_mask] == labels[train_mask]).float().mean()
        val_acc = (pred[val_mask] == labels[val_mask]).float().mean()
        test_acc = (pred[test_mask] == labels[test_mask]).float().mean()

        # Save the best validation accuracy and the corresponding test accuracy.
        if best_val_acc < val_acc:
            best_val_acc = val_acc
            best_test_acc = test_acc

        # Backward
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if e % 5 == 0:
            print('In epoch {}, loss: {:.3f}, val acc: {:.3f} (best {:.3f}), test acc: {:.3f} (best {:.3f})'.format(
                e, loss, val_acc, best_val_acc, test_acc, best_test_acc))
model = GCN(g.ndata['feat'].shape[1], 16, dataset.num_classes)
train(g, model)

输出如下:

你也可以将DPL与 TensorFlow 结合使用。 这将要求你在环境中设置环境变量 DGLBACKEND。 以下是如何在 Google Colab 上完成此操作:

!export DGLBACKEND tensorflow

10、在 TensorFlow 和 Keras 中实现图神经网络

这篇论文提出了基于TensorFlow和Keras的Keras图卷积神经网络Python包(kgcnn)。 它为图神经网络提供 Keras 层。 官方页面提供了大量如何使用该包的示例。 示例之一是如何使用 Cora 数据集使用 kgcnn 进行节点分类。 让我们看一下这个插图的一个片段。

第一步通常是加载所需的包:

from kgcnn.data.cora.cora import cora_graph
from kgcnn.literature.GCN import make_gcn
from kgcnn.utils.adj import precompute_adjacency_scaled, convert_scaled_adjacency_to_list, make_adjacency_undirected_logical_or
from kgcnn.utils.data import ragged_tensor_from_nested_numpy
from kgcnn.utils.learning import lr_lin_reduction

下一步是加载数据并将其转换为密集矩阵:

# Download and load Dataset
A_data, X_data, y_data = cora_graph()
# Make node features dense
nodes = X_data.todense()

下一步是预先计算缩放后的无向邻接矩阵,并将邻接矩阵映射到索引列表加上边权重。 之后,使用 NumPy 转换数组的形状:

# Precompute scaled and undirected (symmetric) adjacency matrix
A_scaled = precompute_adjacency_scaled(make_adjacency_undirected_logical_or(A_data))
# Use edge_indices and weights instead of adj_matrix
edge_index, edge_weight = convert_scaled_adjacency_to_list(A_scaled)
edge_weight = np.expand_dims(edge_weight, axis=-1)

接下来,one-hot 对标签进行编码:

# Change labels to one-hot-encoding
labels = np.expand_dims(y_data, axis=-1)
labels = np.array(labels == np.arange(70), dtype=np.float)

可以使用 make_gcn 函数定义模型。 该函数需要输入节点的形状、输入边的形状、深度等:

model = make_gcn(
    input_node_shape=[None, 8710],
    input_edge_shape=[None, 1],
    # Output
    output_embedd={"output_mode": 'node'},
    output_mlp={"use_bias": [True, True, False], "units": [140, 70, 70], "activation": ['relu', 'relu', 'softmax']},
    # model specs
    depth=3,
    gcn_args={"units": 140, "use_bias": True, "activation": "relu", "has_unconnected": True}
)

以下是该模型的摘要:

下一步是训练这个模型。 训练在 Google Colab 上进行 300 个 epoch 后结束:

# Training loop
trainlossall = []
testlossall = []
start = time.process_time()
for iepoch in range(0, epo, epostep):
    hist = model.fit(xtrain, ytrain,
                     epochs=iepoch + epostep,
                     initial_epoch=iepoch,
                     batch_size=1,
                     callbacks=[cbks],
                     verbose=1,
                     sample_weight=train_mask  # Important!!!
                     )

    trainlossall.append(hist.history)
    testlossall.append(model.evaluate(xtrain, ytrain, sample_weight=val_mask))
stop = time.process_time()
print("Print Time for taining: ", stop - start)

然后,可以通过使用 Matplotlib 绘制训练和测试损失来检查训练和测试损失:

plt.figure(figsize=(12,8))
plt.plot(np.arange(1, len(trainlossall) + 1), trainlossall, label='Training Loss', c='blue')
plt.plot(np.arange(epostep, epo + epostep, epostep), testlossall[:, 1], label='Test Loss', c='red')
plt.xlabel('Epochs')
plt.ylabel('Accurarcy')
plt.title('GCN')
plt.legend(loc='lower right', fontsize='x-large')
plt.savefig('gcn_loss.png')
plt.show()

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

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

相关文章

使用docker镜像快速构建TVM

TVM docekr编译 文章目录 TVM docekr编译使用云镜像使用docker进行本地构建 使用云镜像 下载docker镜像 如果对docker指令不熟悉可以查阅&#xff1a; docker cli命令行 AP I TVM docker hub镜像 docker pull tlcpack/ci-cpu:20230604-060130-0af9ff90e运行container docker…

Java面试——框架篇

1、Spring框架中的单例bean是线程安全的吗&#xff1f; 所谓单例就是所有的请求都用一个对象来处理&#xff0c;而多例则指每个请求用一个新的对象来处理。 结论&#xff1a;线程不安全。 Spring框架中有一个Scope注解&#xff0c;默认的值就是singleton&#xff0c;单例的。一…

Java学习——设计模式——行为型模式2

文章目录 行为型模式状态模式观察者模式中介者模式迭代器模式访问者模式备忘录模式解释器模式 行为型模式 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;涉及算法与对象间职责的…

kubernetes(六)

文章目录 1. k8s架构2. k8s安装2.1 颁发证书2.2 部署etcd集群2.3 master节点安装2.3.1 api-server服务安装2.3.2 controller-manager服务安装2.3.3 scheduler服务安装 2.4 node节点安装2.5 配置flannel网络 1. k8s架构 2. k8s安装 # 增加免密操作 [rootk8s-node3 ~]# ssh-keyge…

搭建一个教育小程序的必要步骤

随着科技的飞速发展&#xff0c;小程序已经深入到我们生活的方方面面。对于教育行业来说&#xff0c;小程序的出现不仅为教育机构提供了新的宣传和互动平台&#xff0c;更为学生和家长带来了更为便捷的学习体验。那么&#xff0c;如何开发一款适合教育机构的小程序呢&#xff1…

react+AntDesign 之 pc端项目案例

1.环境搭建以及初始化目录 CRA是一个底层基于webpack快速创建React项目的脚手架工具 # 使用npx创建项目 npx create-react-app react-jike# 进入到项 cd react-jike# 启动项目 npm start2.安装SCSS SASS 是一种预编译的 CSS&#xff0c;支持一些比较高级的语法&#xff0c;…

鸿蒙OS:不止手机,是物联网应用开发

鸿蒙开发是华为自主研发的面向全场景的分布式操作系统&#xff0c;旨在将生活场景中各类终端进行整合&#xff0c;实现不同终端设备间的快速连接、资源共享、匹配合适设备、提供流畅的全场景体验。 鸿蒙开发具有以下特点&#xff1a; 面向全场景&#xff1a;鸿蒙系统能够覆盖…

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-3流体系统建模

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-12课程介绍电路系统建模、基尔霍夫定律 流量 flow rate q q q m 3 / s m^3/s m3/s 体积 volume V V V m 3 m^3 m3 高度 heigh h h h m m m 压强 pressure p p p …

竞赛练一练 第23期:NOC大赛每日一练,python题目刷题第8天,包含答案解析

题目来自:NOC 大赛创客智慧编程赛项Python 复赛模拟题(二) NOC大赛创客智慧编程赛项Python 复赛模拟题(二) 第一题: 编写一个成绩评价系统,当输入语文、数学和英语三门课程成绩时,输出三门课程总成绩及其等级。 (1)程序提示用户输入三个数字,数字分别表示语文、数学、…

Vue3使用Pinia

1.安装 npm i pinia 2.搭建架子文件 2.1main.js import { createApp } from vue // 引入pinia import { createPinia } from piniaimport App from ./App.vue import router from ./router // 创建pinia const app createApp(App) //安装pinia app.use(createPinia())app.use(…

线程安全、共享变量的可见性

Java中的线程安全问题 谈到线程安全问题&#xff0c;我们先说说什么是共享资源。所谓共享资源&#xff0c;就是说该资源被多个线程所持有或者说多个线程都可以去访问该资源。 线程安全问题是指当多个线程同时读写一个共享资源并且没有任何同步措施时&#xff0c;导致出现脏数…

适合前后端开发的可视化编辑器(拖拽控件)

分享一个面向研发人群使用的前后端分离的低代码软件——JNPF。 JNPF与市面上其他的低代码&#xff08;轻流、宜搭、微搭、简道云、轻流、活字格等等&#xff09;&#xff0c;后者更倾向于非编程人员使用&#xff0c;让业务线人员自行构建应用程序。而 JNPF 这款低代码产品是面向…

【STM32学习】硬件CRC与传统CRC-32计算的不同点

硬件CRC与传统CRC-32计算的不同点 1、stm32的硬件CRC32与传统CRC-32有何不同&#xff1f;2、解决办法 1、stm32的硬件CRC32与传统CRC-32有何不同&#xff1f; ①STM32F103的硬件CRC校验是对整个32位字进行CRC计算&#xff0c;传统的CRC-32是逐字节的计算。 ②STM32的硬件CRC32的…

美食管理与推荐系统Python+Django网站系统+协同过滤推荐算法【计算机课设】

一、介绍 美食管理与推荐系统。本系统使用Python作为主要开发语言开发的一个美食管理推荐网站平台。 网站前端界面采用HTML、CSS、BootStrap等技术搭建界面。后端采用Django框架处理用户的逻辑请求&#xff0c;并将用户的相关行为数据保存在数据库中。通过Ajax技术实现前后端的…

【ThreeJS入门——】WEB 3D可视化技术——threejs

简介 网页上已经可以做出很多复杂的动画&#xff0c;精美的效果。下图就是通过WebGL在网页中绘制高性能的3D图形。 threejs是一个让用户通过javascript入手进入搭建webgl项目的类库。 1、搭建第一个场景和物体 三维的物体要渲染在二维的屏幕上。首先要创建一个场景来放置物体…

ASP.NET可视化流程设计器源码

源码介绍: ASP.NET可视化流程设计器源码已应用于众多大型企事业单位。拥有全浏览器兼容的可视化流程设计器、表单设计器、基于角色的权限管理等系统开发必须功能&#xff0c;大大为您节省开发时间&#xff0c;是您开发OA.CRM、HR等企事业各种应用管理系统和工作流系统的最佳基…

技术旅程分享:收获与成长的探索

2023年对我而言是充满挑战和机遇的一年&#xff0c;我在这段时间里积累了丰富的技术经验和个人成长。通过不懈努力和持续学习&#xff0c;我在技术领域迈出了一系列坚实的步伐。在这篇文章中&#xff0c;我将分享我在这段时间中的收获和技术成长经历&#xff0c;与CSDN的朋友们…

Vue实现加减法验证码

引入Vue.js 在HTML文件的<head>标签中引入Vue.js的CDN链接&#xff1a; <script src"https://cdn.jsdelivr.net/npm/vue2.6.11/dist/vue.min.js"></script>创建Vue实例 接下来&#xff0c;我们要创建一个Vue实例&#xff0c;并将其挂载到HTML文…

MIT 6.s081 实验解析——labs2

系列文章目录 MIT 6.s081 实验解析——labs1 MIT 6.s081 实验解析——labs2 文章目录 系列文章目录测试判断流程System call tracingsysinfo![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ab9ca34f1fc64b6aa1df74613dc1a397.png) 测试判断流程 完成代码后将.c文…

领取的试用云服务器在哪

系列文章目录 华为云服务器试用领取 领取的试用云服务器在哪 文章目录 系列文章目录步骤如下 步骤如下 领取完之后在官网下找 在下面找到华为云耀云服务器L实例。 点击进入。 点击HECS。 即可找到自己的云服务器。 需要注意所勾选的地址&#xff0c;选完自己云服务器的地址…