一篇文章看懂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

相关文章

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三