DGL如何表征一张图

2024-02-20 09:30
文章标签 一张 表征 dgl

本文主要是介绍DGL如何表征一张图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有关于DGL中图的构建

DGL 将有向图表示为一个 DGL 图对象。图中的节点编号连续,从0开始。我们一般通过指定图中的节点数,以及源节点和目标节点的列表,来构建这么一个图。

下面的代码构造了一个图,这个图有五个叶子节点。中心节点的 ID 为 0,边从中心节点出发,指向众多的叶子节点。
在这里插入图片描述

g = dgl.graph(([0, 0, 0, 0, 0], [1, 2, 3, 4, 5]), num_nodes=6)
# 同样地,PyTorch LongTensors 也可以使用
g = dgl.graph((torch.LongTensor([0, 0, 0, 0, 0]), torch.LongTensor([1, 2, 3, 4, 5])), num_nodes=6)
# 如果你可以从 edge list 中看出有多少个节点,也可以不制定 nodes 的数量
g = dgl.graph(([0, 0, 0, 0, 0], [1, 2, 3, 4, 5]))

在这个图中,边具有从0开始且连续的ID。并且在创建的过程中,边的顺序和源节点到目标节点列表的顺序相同。换句话说,我们在创建 g 的时候,并不需要特地指定边,而是直接通过起始点列表,也就是 [0, 0, 0, 0, 0] 和 目标点列表 [1, 2, 3, 4, 5] 来自动生成边。

# 打印每条边的源节点和目标节点
print(g.edges())

为图指定节点和边的特征

我们建立的图,往往其边和节点都是有特定的属性的。在现实世界中,图中节点代表的实体可能有多种多样的属性,比如“人”实体可能有性别、年龄、姓名等等属性。
不过在 DGLGraph 中,我们的属性都是张量化的存储的,因此所有的节点或者边的属性都具有相同的维度(shape)
当然我们现在是为了学习图神经网络,所以这里我们就把这些属性称为“特征”。我们可以采用 ndateedata 来给节点(node)和边(edge)赋予特征。

# 为每个节点赋予一个 3维 的特征向量,总共6个节点。
g.ndata['x'] = torch.randn(6, 3)
# 为每条边赋予一个 4维 的特征向量,总共5条节点。
g.edata['a'] = torch.randn(5, 4)
# 为每个节点赋予一个 5x4 的特征矩阵,总共6个节点。
# 注意在 DGL 中,点和边的特征可以是多维的。
g.ndata['y'] = torch.randn(6, 5, 4)
print(g.edata['a'])

下图中心形代表是边的特征。
在这里插入图片描述
请注意,这里我们为 ndata 赋予了 x 和 y 两种特征,这里的 x 和 y 就是节点的特征名称,应该是作为一个key去查询所有节点对应的 tensor 列表,然后返回相应的值。同理我们可以赋予更多的特征,然后给特征起名。
在这里插入图片描述
其他建议:

·对于分类属性(例如性别、职业),请考虑将它们转换为整数或 one-hot 编码。
·对于可变长度的字符串内容(例如新闻文章),请考虑应用语言模型。
·对于图像,请考虑应用 CNN 等 CV 模型。

图结构的查询

DGLGraph 对象提供了不同的方法,以方便我们查询图的结构。

查询节点数量

print(g.num_nodes())

查询边数量

print(g.num_edges())

中心节点 0 的出度

print(g.out_degrees(0))

中心节点 0 的入度

print(g.in_degrees(0))

代码整合

# 图结构的查询
"""DGLGraph 对象提供了不同的方法,以方便我们查询图的结构。"""
# 查询节点数量
print(g.num_nodes())
# 查询边数量
print(g.num_edges())
# 中心节点 0 的出度
print(g.out_degrees(0))
# 中心节点 0 的入度,这里是有向图所以入度应该为0
print(g.in_degrees(0))

图变换

图变换主要包含两种:子图和反向边。子图指的是从一张图中抽离相关的顶点或者相关的边组成新的图;反向边是指将图中每个边添加相反方向的边,一般用于将有向图转变成无向图。

子图

DGL 提供了许多API,让我们可以将图转换为其他结构,比如提取一个子图。这方便我们查询子图和原图的关系。子图的抽取可以分为两种方式:按照边和按照顶点。

# 从原图的节点0、节点1和节点3产生一个子图。
sg1 = g.subgraph([0, 1, 3])
# 从原图的边0、边1和边3产生一个子图。
sg2 = g.edge_subgraph([0, 1, 3])# 对应的节点为:0 1 2  4
"""通过 dgl.NID 或 dgl.EID 我们可以获得从子图到原图的节点/边映射,如下:"""
# The original IDs of each node in sg1
print(sg1.ndata[dgl.NID])
# The original IDs of each edge in sg1--->边的编号:(0,1):编号0    (0,3):编号2
print(sg1.edata[dgl.EID])
# The original IDs of each node in sg2
print(sg2.ndata[dgl.NID])
# The original IDs of each edge in sg2
print(sg2.edata[dgl.EID])

此外, subgraph 和 edge_subgraph 也复制了原图的点和边特征到子图:

# The original node feature of each node in sg1
print(sg1.ndata['x'])
# The original edge feature of each node in sg1
print(sg1.edata['a'])
# The original node feature of each node in sg2
print(sg2.ndata['x'])
# The original edge feature of each node in sg2
print(sg2.edata['a'])

增加反向边

还有一种常用的变换就是,使用 dgl.add_reverse_edges ,向原图的每一条边都增加一个反向边。比如你希望建立一个双向图的时候,这就很有用了。再强调一下,如果你想建立一个无向图,那最好当做双向图来建立

newg = dgl.add_reverse_edges(g)
newg.edges()

图的保存和读取

您可以通过dgl保存一个图形或一个图形列表。保存并使用dgl.load_graphs加载它们如下所示:(当然保存图可以保存一张或者多张,读取亦是如此)

# 保存图
dgl.save_graphs('graph.dgl', g)     # 保存一张图
dgl.save_graphs('graphs.dgl', [g, sg1, sg2]) # 保存多张图# 读取图
(g,), _ = dgl.load_graphs('graph.dgl')
print(g)
(g, sg1, sg2), _ = dgl.load_graphs('graphs.dgl')
print(g)
print(sg1)
print(sg2)

当使用了 save_graphs 命令后,我们可以看到在当前目录下多了两个 .dgl 文件,这就是我们保存的两个图。其中 graphs.dgl 文件包含了之前创建的原图和两个子图。
在这里插入图片描述

这篇关于DGL如何表征一张图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

图神经网络框架DGL实现Graph Attention Network (GAT)笔记

参考列表: [1]深入理解图注意力机制 [2]DGL官方学习教程一 ——基础操作&消息传递 [3]Cora数据集介绍+python读取 一、DGL实现GAT分类机器学习论文 程序摘自[1],该程序实现了利用图神经网络框架——DGL,实现图注意网络(GAT)。应用demo为对机器学习论文数据集——Cora,对论文所属类别进行分类。(下图摘自[3]) 1. 程序 Ubuntu:18.04

Oracle把一个表的某个字段更新到另一张表中

第一种方法: update tablea set column_name1=(select name2 from tableb where tableb.name3=tablea.name1) 只修改一个 update tablea set column_name1=(select name2 from tableb where tableb.name3='a') where tablea.na

阿里十年架构师用一张图告诉你什么是系统架构师

阿里十年架构师用一张图告诉你什么是系统架构师 Java架构解析 2018-11-03 20:54:41 这张图从架构师的综合能力、岗位认识、岗位职责等方面,清楚的画出了作为一个架构的基本准则。人人都想成为架构师,可作为架构你达到了图上面的要求了吗?   系统架构师是个神奇的岗位。为什么这么说,在一个人数不多的小公司,你可能什么都需要做,身体力行,做总监兼架构师或者是主管/高级开发兼架构

oracle存储过程Loop循环一张表插入到另外一张表

oracle存储过程Loop循环一张表插入到另外一张表   1、创建一个存储过程   Sql代码   create or replace procedure inserttest as   cursor cs is SELECT sales_id FROM t02salesinfo_backup;sales_id varchar(128);   begin   for c in c

项目实训:创建一张贺卡以及一只盒子——WEB开发系列27

以下是两道关于基础 CSS 盒模型和其他盒子相关特性的练习题,适合测试对这些概念的掌握程度,通过实际的设计任务来深入理解这些概念。 练习题 1: 设计一张中秋节海报贺卡 任务描述 制作一张精美的中秋节海报贺卡,用于庆祝这个传统节日。你的目标是应用 CSS 盒模型的各种属性来创建一个视觉上吸引人的海报,包括边距(margin)、边框(border)、内边距(padding)和内容区域(co

自然语言处理-应用场景-文本生成:Seq2Seq --> 看图说话【将一张图片转为一段文本】

人工智能-自然语言处理(NLP)-应用场景-Seq2Seq:看图说话【将一张图片转为一段文本】

NLP-词向量-发展:词袋模型【onehot、tf-idf】 -> 主题模型【LSA、LDA】 -> 词向量静态表征【Word2vec、GloVe、FastText】 -> 词向量动态表征【Bert】

NLP-词向量-发展: 词袋模型【onehot、tf-idf】主题模型【LSA、LDA】基于词向量的静态表征【Word2vec、GloVe、FastText】基于词向量的动态表征【Bert】 一、词袋模型(Bag-Of-Words) 1、One-Hot 词向量的维数为整个词汇表的长度,对于每个词,将其对应词汇表中的位置置为1,其余维度都置为0。 缺点是: 维度非常高,编码过于稀疏,易出

GNN-第三方库:DGL【图神经网络框架,支持对异构图的处理,开源相关异构图神经网络的代码,在GCMC、RGCN等业内知名的模型实现上也取得了很好的效果】

一、DGL库的实现与性能 实现GNN并不容易,因为它需要在不规则数据上实现较高的GPU吞吐量。 1、DGL库简介 DGL库的逻辑层使用了顶点域的处理方式,使代码更容易理解。同时,又在底层的内存和运行效率方面做了大量的工作,使得框架可以发挥出更好的性能。 2、DGL库特点 GCMC:DGL的内存优化支持在一个GPU上对MovieLens10M数据集进行训练(原实现需要从CPU中动态加载数据