DGL库之HGTConv的使用

DGL库之HGTConv的使用

  • 论文地址和异构图构建教程
  • HGTConv语法格式
  • HGTConv的使用

论文地址和异构图构建教程

论文地址:https://arxiv.org/pdf/2003.01332
异构图构建教程:异构图构建
异构图转同构图:异构图转同构图

HGTConv语法格式

dgl.nn.pytorch.conv.HGTConv(in_size, head_size, num_heads, num_ntypes, num_etypes, dropout=0.2, use_norm=False)

参数说明:

  • in_size (int): 输入节点特征的大小。
  • head_size (int): 输出头的大小。输出节点特征的大小为 head_size * num_heads。
  • num_heads (int): 头的数量。输出节点特征的大小为 head_size * num_heads。
  • num_ntypes (int): 节点类型的数量。
  • num_etypes (int): 边类型的数量。
  • dropout (可选, float): dropout 比率,用于防止过拟合。
  • use_norm (可选, bool): 如果为 True,则在输出节点特征上应用层归一化。
forward(g, x, ntype, etype, *, presorted=False)

参数说明:

  • g (DGLGraph): 输入的图对象。

  • x (torch.Tensor): 一个 2D 张量,表示节点特征。其形状应为 (num_nodes, in_size),num_nodes 是节点数量,in_size 是输入特征的维度。

  • ntype (torch.Tensor): 一个 1D 整数张量,表示节点类型。其形状应为 (num_nodes,),对应每个节点的类型索引。

  • etype (torch.Tensor): 一个 1D 整数张量,表示边类型。其形状应为 (num_edges,),对应每条边的类型索引。

  • presorted (bool, 可选): 指示输入图的节点和边是否已经按照类型排序。如果输入图是预排序的,则前向传播可能会更快。通过调用 to_homogeneous()创建的图会自动满足此条件。也可以使用 reorder_graph() 方法手动重新排序节点和边。

返回值:

  • 返回的新节点特征: 返回的特征是一个 2D 张量,其形状为 (num_nodes, head_size * num_heads),表示经过HGTConv 处理后的新节点特征,返回的张量类型为 torch.Tensor。

HGTConv的使用

使用的异构图如下:
在这里插入图片描述
在使用HGTConv时,一定要使用dgl.to_homogeneous将异构图转为同构图,否则不能使用,代码如下:

import dgl
import torch
import torch.nn as nn
import dgl.nn.pytorch# 定义一个简单的异构图
def create_hetero_graph():# 定义两个类型的节点:drug(药物)和 disease(疾病)data_dict = {('drug', 'd_interacts', 'drug'): (torch.tensor([0, 1]), torch.tensor([1, 2])),  # 药物间的相互作用('drug', 'g_interacts', 'gene'): (torch.tensor([0, 1]), torch.tensor([2, 3])),  # 药物与基因间的相互作用('drug', 'treats', 'disease'): (torch.tensor([1]), torch.tensor([2]))           # 药物与疾病的关系}# 创建一个异构图hetero_graph = dgl.heterograph(data_dict)# 设置节点和边的特征hetero_graph.nodes['drug'].data['h'] = torch.ones(3, 320)  # 假设药物特征是320维的hetero_graph.nodes['disease'].data['h'] = torch.zeros(3, 320)  # 假设疾病特征是320维的hetero_graph.nodes['gene'].data['h'] = torch.ones(4, 320)  # 假设基因特征是320维的return hetero_graph# 定义一个HGT模型类
class HGTModel(nn.Module):def __init__(self, in_dim, out_dim, num_heads, num_layers, num_node_types, num_edge_types, dropout=0.2):super(HGTModel, self).__init__()# 使用 dgl.nn.pytorch.conv.HGTConv 初始化 HGT 卷积层self.layers = nn.ModuleList()  # 创建一个空的层列表for _ in range(num_layers):layer = dgl.nn.pytorch.conv.HGTConv(in_dim,  # 输入维度out_dim,  # 输出维度num_heads,  # 注意力头的数量num_node_types,  # 节点类型数量num_edge_types,  # 边类型数量dropout=dropout  # dropout比率)self.layers.append(layer)  # 将层添加到列表中def forward(self, g):with g.local_scope():  # 创建一个局部作用域,‌确保对图的操作不会影响原始图。‌for layer in self.layers:# 使用HGTConv层进行卷积操作h = layer(g, g.ndata['h'], g.ndata['_TYPE'], g.edata['_TYPE'], presorted=True)g.ndata['h'] = h  # 更新节点特征return g.ndata['h']  # 返回最后一层的节点特征# 创建一个异构图
hetero_graph = create_hetero_graph()print('异构图为:\n',hetero_graph)  # 输出异构图的信息
# 将异构图转换为同构图
homogeneous_graph = dgl.to_homogeneous(hetero_graph, ndata=['h'])
print(f"节点特征矩阵为:\n{homogeneous_graph.ndata['h']}")  # 打印节点特征的类型# 创建模型并移动到 CPU 设备
hgt_model = HGTModel(in_dim=320, out_dim=80, num_heads=4, num_layers=2,num_node_types=3, num_edge_types=3, dropout=0.3).to(torch.device('cpu'))# 前向传播
output_features = hgt_model(homogeneous_graph)print("更新后的特征:\n", output_features)  # 输出特征的形状

结果如下:
在这里插入图片描述

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

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

相关文章

示教器界面介绍

1. 示教器外部按键介绍 1. 程序编辑完成后,可以热插拔示教器,按下拔出示教器按钮 2. 模式切换旋钮,切换到水平状态进行模式选择:T1手动低速、T2手动高速、自动模式、外部自动模式,选择完成后,模式切换旋钮…

数据质量指标:如何衡量数据的准确性

数据质量是任何数据驱动运营的重要组成部分。即使对于不打算将数据集出售给其他公司的企业,数据的质量和准确性也会极大地影响决策效率。 不幸的是,没有单一指标可以确保数据质量达到标准。您必须跟踪多个指标并不断关注它们。因此,维护数据…

阅读摘抄(七)——The best approach to address the misuse of body ideals

adj.道德的,伦理的,环保的,(药品)凭处方出售的 n/v.误用,滥用 v.虐待,不公平对待Relying on ethical persuasion rather than law to address the misuse of body ideals may bev.相信,依赖 n.说服力 persuade v.说服,劝服,使相信,使信服 …

【案例】—— 基于OpenCV方法的指纹验证

一、案例整体介绍 下图中上面一张指纹图片与下面两张图片中的其中一个指纹是同一个指纹分别将上面的指纹图片与下面的两张图片进行匹配验证在model(模板指纹图片)与验证的两张指纹图片的2次匹配中,分别需要提取出模板指纹图片与验证指纹图片的特征(特征检测)&#…

【论文阅读】SRCNN

学习资料论文题目:Learning a Deep Convolutional Network for Image Super-Resolution(学习深度卷积网络用于图像超分辨率)论文地址:link.springer.com/content/pdf/10.1007/978-3-319-10593-2_13.pdf代码:作者提出的…

Vue检测获取最新资源 解决浏览器缓存问题

Vue检测获取最新资源 解决浏览器缓存问题 1、在public文件夹下创建version.json文件2、vue.config.js中,每次打包动态更新version.json内容3、App.vue中使用定时器去检测版本号和本地是否有差异 背景:由于浏览器缓存问题,vue2项目发布后&…

【HTML】defer 和 async 属性在 script 标签中分别有什么作用?

需要这两个属性的原因? 首先我们要知道的是,浏览器在解析 HTML 的过程中,遇到了 script 元素是不能继续构建 DOM 树的。 它会停止解析构建,首先去下载 js 代码,并且执行 js 的脚本;只有在等到 js 脚本执行…

selenium自动化测试之Junit

1. 常用的注解 将junit的索引添加到pom文件&#xff1a; <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId&…

CPU超线程技术是什么,怎么启用超线程技术

超线程技术是一种允许单个物理CPU核心模拟成两个逻辑核心的技术&#xff0c;从而提升处理器的并行性能和效率。以下是对超线程技术的详细介绍&#xff1a; 基本概念&#xff1a;超线程&#xff08;Hyper-Threading&#xff0c;HT&#xff09;是Intel公司研发的一种技术&#x…

QD1-P12 HTML常用标签:表格

本节学习 HTML常用标签&#xff1a;表格标签table ‍ 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p12 ‍ 知识点1 表格的基本结构 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>P12-表格标签</title><…

SpringBoot整合web中使用jsp

1、在pom.xml文件中导入jsp依赖的jar包&#xff0c;一个是jstl标签&#xff0c;一个是jsp的引擎 <dependency><groupId>org.apache.taglibs</groupId><artifactId>taglibs-standard-spec</artifactId><version>1.2.5</version> <…

如何在RuoYi-Vue项目中去除`/dev-api`前缀

前言 在使用RuoYi-Vue框架进行Web应用开发时&#xff0c;有时会遇到API路径需要特定前缀的问题。例如&#xff0c;在某些情况下&#xff0c;开发者可能希望移除或更改默认的/dev-api前缀。 问题描述 当使用YApi直接请求后台接口时&#xff0c;无需添加/dev-api前缀。在生成和…

Java入门——变量

变量和内存紧密联系在一起&#xff0c;主要通过以下方式实现关联&#xff1a; 一、变量的定义与内存分配 变量声明&#xff1a; 当在编程语言中声明一个变量时&#xff0c;编译器或解释器会根据变量的类型在内存中为其分配一块特定大小的空间。 例如&#xff0c;在 C 语言中声明…

包材推荐中的算法应用|得物技术

目录 一、业务背景 二、算法架构 规则算法 三、算法原理 装箱装袋 四、衍生应用 切箱合包箱型设计包装方案推荐 五、作者结语 一、业务背景 任何一家电商的商品出库场景中&#xff0c;都涉及到打包——即把订单中的商品用包材进行包裹&#xff0c;常见的打包方式有装袋和装箱。…

算法复杂度 (数据结构)

一. 数据结构前言 1.1 什么是数据结构 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用&#xff0c;所以我们要学各式各样的数据结构&#xff0c;如&#xff1…

[Qt] 信号与槽:深入浅出跨UI与跨线程的信号发送

文章目录 如何自定义信号并使用自定义信号的步骤1.使用 signals 声明信号2. 信号的返回值是 void3. 在需要发送信号的地方使用 emit4. 使用 connect 链接信号和槽5. 完整代码示例总结 如何跨UI发送信号Qt跨UI发送信号机制详解案例概述Qt 信号与槽机制简介代码逻辑详解主窗口 Wi…

进程通讯方式区别(从不同角度看)

*常用到的不同主机间进程通讯&#xff1a;Socket。比如&#xff1a;host和引擎间socket指令通讯、分派和复判之间指令通讯&#xff1b; *共享内存&#xff1a;在Windows系统中&#xff0c;共享内存的实现通常有以下几种方式&#xff1a; 1.内存映射文件(最常用)&#xff1a;(…

计算机毕业设计 医院预约挂号系统的设计与实现 Python毕业设计 Python毕业设计选题【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【01】手把手教你0基础部署SpringCloud微服务商城教学-Mybatis篇(上)

序言&#xff1a; 微服务是一种软件架构风格&#xff0c;它是以专注于单一职责的很多小型项目为基础&#xff0c;组合出复杂的大型应用。 想学习SpringCloud搭建项目&#xff0c;首先我们需要学习的就是Mybatis和Docker。 大家在日常开发中应该能发现&#xff0c;单表的CRUD…

没人告诉你的职场人情世故

看到前同事在群里分享的新年开工遭遇&#xff0c;真是让人感同身受。 第一天就遇到挫折&#xff0c;因为工作做得太快、太早交付&#xff0c;结果反被领导批评&#xff0c;还得重做&#xff0c;头大如斗。这不就提醒我们得时时刻刻记着职场里的那些不成文的规矩吗&#xff1f;…