一篇文章看懂Homogeneous Graph与Heterogeneous Graph,以及如何通过DGL定义数据与模型 进行Batch训练

本文主要是介绍一篇文章看懂Homogeneous Graph与Heterogeneous Graph,以及如何通过DGL定义数据与模型 进行Batch训练,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Homogeneous Graph与Heterogeneous Graph

    • 提供图训练的小知识
    • Homogeneous Graph与Heterogeneous Graph的区别
    • 在DGL(Deep Graph Library) 定义 同构图
    • 在DGL(Deep Graph Library) 定义 异构图

提供图训练的小知识

在一张图进行训练时, 可能由于层数的增加,使得结点可以充分汇聚到其他结点的信息。
layer0: 直接连接的信息被汇聚。
layer1: 间接连接的结点被汇聚。
layer2: …
在这里插入图片描述

Homogeneous Graph与Heterogeneous Graph的区别

  1. Homogeneous Graph(同构图)

同构图是指所有节点和边都是同质的,即节点之间的连接方式相同,边的类型相同。在同构图中,所有节点和边都属于同一种类型。例如,社交网络中的好友关系图就是一个同构图,其中所有节点都代表用户,边代表用户之间的好友关系。
在 DGL 中,使用 dgl.graph() 函数可以创建同构图。同构图的创建可以直接从节点和边的张量数据中构建,所有的节点和边都具有相同的类型。

  1. Heterogeneous Graph(异构图)

异构图是指节点和边可以有不同的类型,节点之间的连接方式和边的类型可以不同。在异构图中,节点和边可以代表不同的实体或关系,具有多样性。例如,电子商务网站中的商品-用户-类别三元关系图就是一个异构图,其中节点分为商品、用户和类别三种类型,边代表商品与用户之间的购买关系以及商品与类别之间的归属关系。
在 DGL 中,使用 dgl.heterograph() 函数可以创建异构图。异构图的创建需要指定不同类型的节点和边,以及它们之间的连接关系。

在DGL(Deep Graph Library) 定义 同构图

  1. 初始化图数据

初始化数据

import dgl
import torch# 初始化图列表
graph_list = []# 构建每组对话的图
for _ in range(batchsize):# 假设每组对话有5个句子num_sentences = 5sentence_features = torch.randn(num_sentences, 768)  # 句子级特征# 添加句子级节点g.add_nodes(num_sentences, {'sentence_feat': sentence_features})g.add_edges([xxxx], [xxxx])  # 添加结点 ([起始结点],[终端结点])# 将图添加到图列表中graph_list.append(g)# 批次化图
batched_graph = dgl.batch(graph_list)
  1. 定义同构图GCN
import dgl
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader# 定义一个简单的GCN模型
class GCN(nn.Module):def __init__(self, in_feats, hidden_size, out_feats):super(GCN, self).__init__()self.conv1 = dgl.nn.GraphConv(in_feats, hidden_size)self.conv2 = dgl.nn.GraphConv(hidden_size, out_feats)def forward(self, g, features):x = torch.relu(self.conv1(g, features))x = self.conv2(g, x)return x

在DGL(Deep Graph Library) 定义 异构图

  1. 初始化图数据

初始化数据

import dgl
import torch# 初始化一个空的异构图列表
hetero_graph_list = []# 遍历每组对话数据,构建异构图
for _ in range(batchsize):# 初始化一个异构图对象 ([xxx], [xxx] 表示 起始结点)g = dgl.heterograph({('结点类型1', '关系', '结点类型2'): ([xxx], [xxx]),('结点类型1', '关系', '结点类型3'): ([xxx], [xxx]),('结点类型2', '关系', '结点类型3'): ([xxx], [xxx]),})# 添加节点特征g.nodes['结点类型1'].data['feat'] = 结点类型1特征g.nodes['结点类型2'].data['feat'] = 结点类型2特征g.nodes['结点类型3'].data['feat'] = 结点类型3特征# 将图对象添加到异构图列表中hetero_graph_list.append(g)# 使用 dgl.batch_hetero() 函数将异构图列表批次化
batched_hetero_graph = dgl.batch_hetero(hetero_graph_list)
  1. 定义异构图网络结构
import dgl
import torch
import torch.nn as nn
import torch.nn.functional as Fclass HeteroGCN(nn.Module):def __init__(self, in_feats, hidden_feats, out_feats):super(HeteroGCN, self).__init__()# 定义每种节点类型的图卷积层self.conv1 = dgl.nn.HeteroGraphConv({'结点类型1': dgl.nn.GraphConv(in_feats['结点类型1'], hidden_feats),'结点类型2': dgl.nn.GraphConv(in_feats['结点类型2'], hidden_feats),'结点类型3': dgl.nn.GraphConv(in_feats['结点类型3'], hidden_feats)})self.conv2 = dgl.nn.HeteroGraphConv({'结点类型1': dgl.nn.GraphConv(hidden_feats, out_feats),'结点类型2': dgl.nn.GraphConv(hidden_feats, out_feats),'结点类型3': dgl.nn.GraphConv(hidden_feats, out_feats)})def forward(self, g, node_features):# 执行第一层异构图卷积h = self.conv1(g, node_features)# 应用激活函数h = {k: F.relu(h[k]) for k in h.keys()}# 执行第二层异构图卷积h = self.conv2(g, h)return h

这篇关于一篇文章看懂Homogeneous Graph与Heterogeneous Graph,以及如何通过DGL定义数据与模型 进行Batch训练的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903792

相关文章

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR