简单了解DGL中的数据格式
目录
- 前言
- 1. DGL数据集
- 2. dgl.DGLGraph
- 3. dgl.graph
- 4. dgl.heterograph
前言
在PyG搭建GCN前的准备:了解PyG中的数据格式中讲解了PyG中的数据格式,DGL是与PyG齐名的另一大图神经网络框架,二者各有优缺点,建议都学习并掌握。
1. DGL数据集
本篇文章使用Citeseer网络。Citeseer网络是一个引文网络,节点为论文,一共3327篇论文。论文一共分为六类:Agents、AI(人工智能)、DB(数据库)、IR(信息检索)、ML(机器语言)和HCI。如果两篇论文间存在引用关系,那么它们之间就存在链接关系。
DGL加载Citeseer网络:
import dgl
from dgl.data.citation_graph import CiteseerGraphDatasetdataset = CiteseerGraphDataset()
print(len(dataset))
输出为1,说明只有一个网络,然后我们输出一下这个网络:
graph = dataset[0]
print(type(graph))
print(graph)
输出:
<class 'dgl.heterograph.DGLHeteroGraph'>
Graph(num_nodes=3327, num_edges=9228,ndata_schemes={'train_mask': Scheme(shape=(), dtype=torch.bool), 'label': Scheme(shape=(), dtype=torch.int64), 'val_mask': Scheme(shape=(), dtype=torch.bool), 'test_mask': Scheme(shape=(), dtype=torch.bool), 'feat': Scheme(shape=(3703,), dtype=torch.float32)}edata_schemes={'__orig__': Scheme(shape=(), dtype=torch.int64)})
在DGL中,所有图都为dgl.DGLGraph格式,为了创建图,可以有以下两种方法:dgl.graph()和dgl.heterograph(),这两个方法分别创建同质图和异质图,二者返回的都是dgl.DGLGraph。
因此,下面先了解一下dgl.DGLGraph。
2. dgl.DGLGraph
dgl.DGLGraph类有以下属性和方法:
首先是属性:
DGLGraph.ntypes
返回图中所有类型节点的名称,如上面的网络返回:
['_N']
表明只有一种类型的节点,即论文节点。
同理还有边类型:
DGLGraph.etypes
输出为:
['_E']
同样只有一种类型的边。此外,DGLGraph.srctypes和DGLGraph.dsttypes分别返回源节点和目标节点的类型。
print(graph.metagraph()) # 返回异质图的元图
MultiDiGraph with 1 nodes and 1 edges
print(graph.num_nodes()) # 返回节点数
3327
print(graph.num_edges()) # 返回边数
9228
DGLGraph.nodes()返回节点集合:
print(graph.nodes())
tensor([ 0, 1, 2, ..., 3324, 3325, 3326])
边集合:
print(graph.edges())
(tensor([ 2, 3, 0, ..., 3323, 3326, 3325]), tensor([ 0, 0, 0, ..., 3324, 3325, 3326]))
同样是两个列表,分别对应两端节点编号。
ndata返回节点上的一些信息:
print(graph.ndata)
{'train_mask': tensor([False, True, False, ..., False, False, True]), 'label': tensor([1, 4, 1, ..., 5, 3, 3]), 'val_mask': tensor([False, False, False, ..., False, False, False]), 'test_mask': tensor([False, False, False, ..., False, False, False]), 'feat': tensor([[0., 0., 0., ..., 0., 0., 0.],[0., 0., 0., ..., 0., 0., 0.],[0., 0., 0., ..., 0., 0., 0.],...,[0., 0., 0., ..., 0., 0., 0.],[0., 0., 0., ..., 0., 0., 0.],[0., 0., 0., ..., 0., 0., 0.]])}
feat表示节点特征。
同理有edata,这里不再详细讲解。
3. dgl.graph
利用dgl.graph()方法构建同质图:
dgl.graph(data, ntype=None, etype=None, *, num_nodes=None, idtype=None, device=None, row_sorted=False , col_sorted=False, **deprecated_kwargs )
其中data的形式为(U, V),表示边的两边节点集合;num_nodes表示节点数,如果没有给出,将使用data中的最大id+1,这可能会引发错误:
src_ids = torch.tensor([2, 3, 4])
# Destination nodes for edges (2, 1), (3, 2), (4, 3)
dst_ids = torch.tensor([1, 2, 3])
g = dgl.graph((src_ids, dst_ids))
print(g.num_nodes())
返回的节点数为5,如果给定num_nodes<=4,将引发错误。
4. dgl.heterograph
dgl.heterograph( data_dict , num_nodes_dict=None , idtype=None , device=None )
具体例子:
data_dict = {('user', 'follows', 'user'): (torch.tensor([0, 1]), torch.tensor([1, 2])),('user', 'follows', 'topic'): (torch.tensor([1, 1]), torch.tensor([1, 2])),('user', 'plays', 'game'): (torch.tensor([0, 3]), torch.tensor([3, 4]))
}
g = dgl.heterograph(data_dict)
print(g)
上图中,一共有user、topic和game三种类型的节点,他们有三种类型的关系,右边的数据表示边两边节点的索引。
此外,可以显式指定节点个数:
num_nodes_dict = {'user': 4, 'topic': 4, 'game': 6}
g = dgl.heterograph(data_dict, num_nodes_dict=num_nodes_dict)
这里一样指定数目不能小于边集合中的最小索引+1。
简单了解DGL中的数据格式相关推荐
- 利用DGL中的消息传递API手搭GCN实现节点分类
目录 1. 前言 2. 数据 3. GCN 3.1 消息函数 3.2 聚合函数 3.3 更新函数 3.4 模型训练/测试 1. 前言 前面的两篇文章分别介绍了DGL中的数据格式和消息传递API: 了解 ...
- python中len用法_简单介绍Python中的len()函数的使用
简单介绍Python中的len()函数的使用 函数:len() 1:作用:返回字符串.列表.字典.元组等长度 2:语法:len(str) 3:参数:str:要计算的字符串.列表.字典.元组等 4:返回 ...
- 目标检测中的数据格式转换工具Roboflow
目标检测中的数据格式转换工具.Roboflow Roboflow提供了您需要的所有工具,将原始图像转换为定制的训练有素的计算机视觉模型,并部署它在您的应用程序中使用. Roboflow支持检测目标和分 ...
- python函数分几种_简单了解Python中的几种函数
python是支持多种范型的语言,可以进行所谓函数式编程,其突出体现在有这么几个函数: filter.map.reduce.lambda.yield lambda lambda函数的使用方法:在lam ...
- python数字类型转换函数_python中的各种数据类型中的数据格式转换
一,转换list中的数据格式 str --> float (一)使用自定义函数 def str2float(list) strlist=[] for i in list: strlist.app ...
- php总是报错,php - 简单工厂模式中的问题,总是报错
php - 简单工厂模式中的问题,总是报错 PHPzhong2017-04-11 09:53:49 0 3 101 //接口 interface calc{ public function g ...
- html js脚本限制 正则,简单谈谈JS中的正则表达式
1.正则表达式包括两部分 ①定义正则表达式的规则: ②正则表达式的模式(i/g/m): 2.声明正则表达式 ① 字面量声明: var reg = /表达式规则/表达式模式: eg:var reg = ...
- 简单介绍Java中Comparable和Comparator
转载自 简单介绍Java中Comparable和Comparator Comparable 和 Comparator是Java核心API提供的两个接口,从它们的名字中,我们大致可以猜到它们用来做对象之 ...
- mysql int()_简单谈谈MySQL中的int(m)
我们在设计表的时候,如果碰到需要设置int(整型)的时候,通常会按照惯例(大家都这样写)设置成int(11).那么这里为什么是11呢?代表的又是什么呢? 以前我一直以为这里是在限制int显示的宽度,后 ...
最新文章
- python3 列表_Python3 列表生成
- sphinx 源码阅读之分词,压缩索引,倒排——单词对应的文档ID列表本质和lucene无异 也是外部排序再压缩 解压的时候需要全部扫描doc_ids列表偏移量相加获得最终的文档ID...
- 如何向妻子解释OOD
- Tinkpad W540 BIOS bug ,中招了,中了一次还送了一次
- c3p0依赖导入失败问题(在使用到c3p0中的ComboPooledDataSource类的时候报错,依赖爆红)
- 动态规划 —— 背包问题 P06 —— 分组背包
- java魔方游戏代码_java swing实现的魔方小游戏源码附带视频指导运行教程
- HDU 6241 Color a Tree
- eclipse写javaee的时候js文件新增函数找不到
- Android开发之ListView中Adapter的优化
- c语言贪吃蛇积分用什么函数,C语言之贪吃蛇(curses库函数)
- win10计算机本地组策略编辑器,Win10家庭版没有本地组策略编辑器怎么办
- 华三交换机配置access命令_华三交换机查看配置命令是什么
- 饼图制作软件,饼图的制作方法
- Ubuntu下启动图形界面startx报错connection to X server lost
- wps怎么减少行间距,WPS的word怎么不能缩小行间距
- java基础知识整理
- 数字华容道(C++)
- 微生物16S测序数据的正确打开方式
- oracle使用PLSQL导出dmp文件一闪而过的解决办法