这一小节对应官方文档的1.2节,主要是介绍图的基本概念以及如何创建图,其实在DGL学习笔记01我们已经学过了,不过为了完整还是再撸一次。
首先由这么一张图,注意这是一个有向图,接下来我们用代码创建它
import torch
import dgl
u = torch.tensor([0, 0, 0, 1])
v = torch.tensor([1, 2, 3, 3])
g = dgl.graph((u, v))
print("nodes: ",g.nodes())
print("edges: ", g.edges())
bg = dgl.to_bidirected(g)
print(bg.edges())
1.2 节介绍了如何创建一个简单的图,但是没有给图的节点和边加上特征,1.3节就是介绍如何给节点和边加上特征。因为我们后面在进行训练的时候不仅仅需要邻接矩阵,还需要各个节点的特征。
import torch
import dgl
g = dgl.graph(([0, 0, 1, 5],
[1, 2, 2, 0])) # 6个结点, 4条边
print(g)
node_feats = torch.tensor([[0, 1, 0],
[1, 1, 0],
[0, 1, 1],
[0, 0, 0],
[1, 0, 1],
[1, 1, 1]])
g.ndata['node_features'] = node_feats
print(g)
print(g.ndata['node_features'])
当然了,我们还可以给edges加上特征,这里我就偷个懒不画图了。
edge_features = torch.randn(g.number_of_edges(), 5) # 使用pytrch 随机初始化边的特征,5维
g.edata['edge_features'] = edge_features # 将边的特征加到graph对象里面
print(g)
print(g.edata['edge_features'])
有时候我们用到的图可能是加权图,那么我们可以将边的权重存在edata里面
weights = torch.tensor([0.3, 0.6, 0.45, 0.25])
g.edata['w'] = weights
print(g)
这一小节主要是介绍通过外部源来创建Graph。
官网给出的教程是从Scipy的稀疏矩阵和networkx来创建graph,但是个人感觉这个不太常用,所以我就举个从csv文件创建的案例吧。