Deep Graph Library (DGL)是一个用于构建图神经网络模型的框架
网址:https://www.dgl.ai/
官方文档:https://docs.dgl.ai/
论坛:https://discuss.dgl.ai/

安装

  • CPU版本:pip install dgl -f https://data.dgl.ai/wheels/repo.html
  • CUDA 11.0:pip install dgl-cu110 -f https://data.dgl.ai/wheels/repo.html

DGL支持PyTorch, MXNet和TensorFlow三种后端,默认为PyTorch,可在~/.dgl/config.json中配置

本章官方文档:https://docs.dgl.ai/guide/graph.html

1.基本概念

图由顶点集合和边集合构成,表示为G=(V, E)
DGL表示图的核心数据结构是dgl.DGLGraph
DGL用整数表示一个顶点,叫做顶点ID;用一对整数(u, v)表示一条边,分别对应边的起点和终点的顶点ID,同时每条边也有一个边ID;在DGL中边都是有向的
DGL使用长度为n的一维张量来表示n个顶点,叫做顶点张量;使用两个顶点张量的元组(U, V)来表示n条边,其中(U[i], V[i])表示第i条边

创建图

>>> import dgl
>>> import torch
>>> u, v = torch.tensor([0, 0, 0, 1]), torch.tensor([1, 2, 3, 3])
>>> g = dgl.graph((u, v))
>>> g
Graph(num_nodes=4, num_edges=4,ndata_schemes={}edata_schemes={})
>>> g.num_nodes()
4
>>> g.num_edges()
4
>>> g.nodes()
tensor([0, 1, 2, 3])
>>> g.edges()
(tensor([0, 0, 0, 1]), tensor([1, 2, 3, 3]))


其中uv可以是PyTorch张量,也可以是Python的整数可迭代对象(例如列表)
g的实际类型是dgl.DGLHeteroGraph,在最新版本中与dgl.DGLGraph等价)

上面的例子中顶点ID的范围是从边中推断出来的,如果具有最大ID的顶点是孤立的(没有关联的边),则需要指定顶点个数:

>>> g = dgl.graph((u, v), num_nodes=8)

dgl.to_bidirected()将有向图转换为无向图

>>> bg = dgl.to_bidirected(g)
>>> bg.edges()
(tensor([0, 0, 0, 1, 1, 2, 3, 3]), tensor([1, 2, 3, 0, 3, 0, 0, 1]))

图的可视化

import networkx as nx
import matplotlib.pyplot as plt
# Since the actual graph is undirected, we convert it for visualization purpose.
nx_g = g.to_networkx().to_undirected()
# Kamada-Kawaii layout usually looks pretty for arbitrary graphs
pos = nx.kamada_kawai_layout(nx_g)
nx.draw(nx_g, pos, with_labels=True, node_color=[[.7, .7, .7]])
plt.show()

完整操作列表:https://docs.dgl.ai/api/python/dgl.DGLGraph.html

2.顶点和边的特征

顶点和边都可以具有若干自定义名字的特征,分别通过ndataedata属性访问
下面的代码创建了两个顶点特征x(长度为3的1维向量)和y(标量),以及一个边特征x(标量)

>>> import dgl
>>> import torch
>>> g = dgl.graph(([0, 0, 1, 5], [1, 2, 2, 0]))  # 6 nodes, 4 edges
>>> g
Graph(num_nodes=6, num_edges=4,ndata_schemes={}edata_schemes={})
>>> g.ndata['x'] = torch.ones(g.num_nodes(), 3)  # node feature of length 3
>>> g.edata['x'] = torch.ones(g.num_edges(), dtype=torch.int32)  # scalar integer feature
>>> g
Graph(num_nodes=6, num_edges=4,ndata_schemes={'x': Scheme(shape=(3,), dtype=torch.float32)}edata_schemes={'x': Scheme(shape=(), dtype=torch.int32)})
>>> # different names can have different shapes
>>> g.ndata['y'] = torch.randn(g.num_nodes(), 5)
>>> g.ndata['x'][1]   # get node 1's feature
tensor([1., 1., 1.])
>>> g.edata['x'][torch.tensor([0, 3])]  # get features of edge 0 and 3
tensor([1, 1], dtype=torch.int32)

关于顶点和边特征:

  • 特征只能是数值(整数/浮点数),可以是标量、向量或多维张量,名字可以任意指定
  • 给顶点特征赋值时,第一维大小必须等于顶点数;给边特征赋值时,第一维大小必须等于边数
  • 要实现加权图,将边的权重作为边特征即可

3.异构图

异构图是具有不同类型的顶点和边的图
在DGL中,不同类型的顶点/边有独立的ID范围和特征存储,如下图所示

在DGL中,异构图是由一系列二分子图指定的,每个二分子图的起点类型、边类型、终点类型分别相同,由一个关系指定,关系是一个字符串三元组:(起点类型, 边类型, 终点类型),例如(‘user’, ‘plays’, ‘game’)

构造异构图的方法是指定一系列关系及其顶点张量对:

{relation1 : (src_node_tensor1, dst_node_tensor1),relation2 : (src_node_tensor2, dst_node_tensor2),...
}

例如,下面的代码构造了一个包含“药物”、“基因”、“疾病”三种顶点和“反应”、“作用”、“治疗”三种边的异构图

>>> import dgl
>>> import torch
>>> # Create a heterograph with 3 node types and 3 edges types.
>>> g = dgl.heterograph({('drug', 'interacts', 'drug'): (torch.tensor([0, 1]), torch.tensor([1, 2])),('drug', 'interacts', 'gene'): (torch.tensor([0, 1]), torch.tensor([2, 3])),('drug', 'treats', 'disease'): (torch.tensor([1]), torch.tensor([2]))
})
>>> g
Graph(num_nodes={'disease': 3, 'drug': 3, 'gene': 4},num_edges={('drug', 'interacts', 'drug'): 2, ('drug', 'interacts', 'gene'): 2, ('drug', 'treats', 'disease'): 1},metagraph=[('drug', 'drug', 'interacts'), ('drug', 'gene', 'interacts'), ('drug', 'disease', 'treats')])

访问异构图中的顶点和边需要指定类型
注意:如果边类型的名字唯一,则可仅使用边类型的名字,否则必须使用关系三元组

>>> g.ntypes
['disease', 'drug', 'gene']
>>> g.etypes
['interacts', 'interacts', 'treats']
>>> g.canonical_etypes
[('drug', 'interacts', 'drug'), ('drug', 'interacts', 'gene'), ('drug', 'treats', 'disease')]
>>> g.num_nodes()
10
>>> g.num_nodes('drug')
3
>>> g.nodes()
DGLError('Node type name must be specified if there are more than one '
>>> g.nodes('drug')
tensor([0, 1, 2])
>>> g.num_edges()
5
>>> g.num_edges(('drug', 'interacts', 'drug'))
2
>>> g.edges['interacts']
dgl._ffi.base.DGLError: Edge type "interacts" is ambiguous. Please use canonical edge type in the form of (srctype, etype, dsttype)
>>> g.num_edges(('drug', 'treats', 'disease'))
1
>>> g.num_edges('treats')
1

同构图和二分图就是只有一个关系的特殊异构图,同构图的起点类型和终点类型也相同,而二分图的起点类型和终点类型不同

>>> # A homogeneous graph
>>> dgl.heterograph({('node_type', 'edge_type', 'node_type'): (u, v)})
>>> # A bipartite graph
>>> dgl.heterograph({('source_type', 'edge_type', 'destination_type'): (u, v)})

访问异构图中顶点和边的特征要使用新的语法:g.nodes['node_type'].data['name']g.edges['edge_type'].data['name']

>>> # Set/get feature 'hv' for nodes of type 'drug'
>>> g.nodes['drug'].data['hv'] = torch.ones(g.num_nodes('drug'))
g.nodes['drug'].data['hv']
tensor([1., 1., 1.])
>>> # Set/get feature 'he' for edge of type 'treats'
>>> g.edges['treats'].data['he'] = torch.zeros(g.num_edges(('drug', 'treats', 'disease')))
>>> g.edges['treats'].data['he']
tensor([0.])

将异构图转换为同构图:dgl.to_homogeneous()

【DGL教程】第1章 图(Graph)相关推荐

  1. 图神经网络框架DGL教程-第4章:图数据处理管道

    更多图神经网络和深度学习内容请关注: 第4章:图数据处理管道 DGL在 dgl.data 里实现了很多常用的图数据集.它们遵循了由 dgl.data.DGLDataset 类定义的标准的数据处理管道. ...

  2. 图神经网络框架DGL教程-第3章:构建图神经网络(GNN)模块

    更多图神经网络和深度学习内容请关注: 第3章:构建图神经网络(GNN)模块 DGL NN模块是用户构建GNN模型的基本模块.根据DGL所使用的后端深度神经网络框架, DGL NN模块的父类取决于后端所 ...

  3. 觅凤c语言教程,C语言程序设计教程 第1章.ppt

    傣永靶莱瑞市芽星谴绥真椎匣灵租骡淬女测推谅应弥蠢仑早饲姑锗佩草隔C语言程序设计教程 第1章C语言程序设计教程 第1章 第1章 绪 论 ? ? 唆闽邹搔绕裂陶短噎诚贤希绞重垒嚷济酸凛委句枉鞘扁渗皋耿淮此 ...

  4. DGL教程【二】如何通过DGL表示一个Graph

    通过本节,将学到: 从头开始用DGL构建一个Graph 给Graph添加节点和边的特征 获取一些图的信息,如节点的度或节点的其他属性 将DGL graph 转换到另一个graph 加载.保存DGL g ...

  5. 图机器学习(Graph Machine Learning)- 第二章 图机器学习简介 Graph Machine Learning

    第二章 图机器学习简介 Graph Machine Learning 文章目录 第二章 图机器学习简介 Graph Machine Learning 前言 1. 环境要求Technical requi ...

  6. 从图(Graph)到图卷积(Graph Convolution):漫谈图 神经⽹络模型 (⼀)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者最近看了一些图与图卷积神经网络的论文,深感其强大,但一些Sur ...

  7. DGL教程【四】使用GNN进行链路预测

    在之前的介绍中,我们已经学习了使用GNN进行节点分类,比如预测一个图中的节点所属的类别.这一节中我们将教你如何进行链路预测,比如预测任意两个节点之间是不是存在边. 本节你将学到: 构建一个GNN的链路 ...

  8. DGL教程【一】使用Cora数据集进行分类

    本教程将演示如何构建一个基于半监督的节点分类任务的GNN网络,任务基于一个小数据集Cora,这是一个将论文作为节点,引用关系作为边的网络结构. 任务就是预测一个论文的所属分类.每一个论文包含一个词频信 ...

  9. 转g代码教程_图深度学习入门教程(九)——图滤波神经网络模型

    本教程是一个系列免费教程,争取每月更新2到4篇.(由于精力有限,近期停止了一段时间,在此向大家道个歉). 主要是基于图深度学习的入门内容.讲述最基本的基础知识,其中包括深度学习.数学.图神经网络等相关 ...

最新文章

  1. nginx的安装与配置
  2. STL总结 (C++)
  3. 生成高分辨率pdf_用于高分辨率图像合成的生成变分自编码器
  4. C++的继承知识点重温
  5. C# Serializable学习
  6. 使用Libxml2解析xml[转]
  7. git tag打标签常用命令
  8. Atlassian 修复严重的 Jira 认证绕过漏洞
  9. AcWing 2019. 拖拉机(双端BFS)
  10. linux系统交叉编译如何打包,构建ARM Linux交叉编译器
  11. php 地区表设计,php消息表设计
  12. windows下Vue安装教程(超级详细,一些细节坑)
  13. ResultSet.next() 速度慢 怎么办
  14. Linux系统安全加固设置详细教程
  15. postgres用户管理及权限控制--赋予某账号只读权限
  16. 吐血整理!140种Python标准库、第三方库和外部工具都有了
  17. 计算机主板会自动切断电源是怎么回事,告诉你电脑自动断电怎么办
  18. 马踏棋盘 (30 分)
  19. 汤晓丹的第四版计算机操作系统--第五章总结概述
  20. 三相永磁同步电机的数学模型

热门文章

  1. (二)DepthAI-python相关接口:OAK Pipeline
  2. Excel插件——LuBan
  3. 如何去除Excel表格中出现的多条虚线
  4. mybatis-plus多表查询(三表多对多关系)
  5. python扫描文件代码
  6. 强烈建议互联网人转战实体和农业,去了就是降维打击!实体太缺人才了,老板也不缺钱!...
  7. 怎么建立局域网_小米频频发布新机 老手机应用文件怎么转移才够快?
  8. 测试面试真题|从手工到测开,一位测试媛宝妈的 BAT 大厂逆袭之旅
  9. 计算机科学与技术专业师范类,计算机科学与技术专业(师范)简介.PDF
  10. 风控ML[13] | 特征稳定性指标PSI的原理与代码分享