101(入门)以后就是开始具体逐项学习图神经网络的各个细节。下面介绍: 1.如何构建图 2.将特征赋给节点或者边,及查询方法 这算是图神经网络最基础最基础的部分了。
DGL中创建的图的方法有: 1. 通过(u, v),u和v分别为起始节点和终止节点的列表,可以是numpy矩阵也可以是tensor 2. scipy中的稀疏矩阵,该稀疏矩阵储存这图的邻接矩阵 3. networkx图对象转化 4. 逐步添加节点与边
先导入所有可能需要的模块
import networkx as nx import dgl import torch as th import numpy as np import scipy.sparse as spp结果如下图: 如果u、v之一是标量,那么DGL会自动使用boadscat机制,适应数组的长度
plt.clf() u = th.tensor(0) v = th.tensor([1,2,3,4,5]) star2= dgl.DGLGraph((u,v)) nx.draw(star2.to_networkx(), with_labels=True)结果与上图类似
稀疏矩阵是图的邻接矩阵
u = th.tensor([0,0,0,0,0]) v = th.tensor([1,2,3,4,5]) adj = spp.coo_matrix((np.ones(len(u)), (u.numpy(), v.numpy()))) #稀疏矩阵 star3 = dgl.DGLGraph(adj) nx.draw(star3.to_networkx(), with_labels=True) plt.show()结果如上图
DGL中的图与networkx中的图是可以相互转化的
g_nx = nx.petersen_graph() #networkx内置的彼得森图 g_dgl = dgl.DGLGraph(g_nx) #生成dgl的图 import matplotlib.pyplot as plt plt.subplot(121) nx.draw(g_nx, with_labels=True) plt.title('Networkx') plt.subplot(122) nx.draw(g_dgl.to_networkx(), with_labels=True) plt.title('DGL') plt.show()结果如下图,可以看出二者等价。
结果如下:
先构建一个图
g = dgl.DGLGraph() g.add_nodes(10) for i in range(0,10): g.add_edge(i, 0) #逐个添加边将特征分配到节点或者边,使用字典的格式存储 {名字:特征张量},称之为fields。 ndata是访问图中节点数据的语法,类似于数组,通过切片访问 edata是访问图中边数据的语法,类似于数组,通过切片访问
有的图可能存在两条重合的边,例如:1->0
lt.clf() g_mutil = dgl.DGLGraph() g_mutil.add_nodes(10) g_mutil.ndata['x'] = th.randn(10, 2) g_mutil.add_edges(list(range(1,10)),0) #图中只有9条边 g_mutil.add_edge(1,0) #再次添加一条1->0的边,此时有两条边了, 分别为第一条边和最后一条边 # 此时图中共计10条边 g_mutil.edata['w'] = th.randn(10, 2) print('第一条边数据:', g_mutil.edges[0].data['w']) print('最后一条边数据', g_mutil.edges[9].data['w']) g_mutil.edges[0].data['w'] = th.zeros(1, 2) #修改第一条边的数据 print('第一条边数据:', g_mutil.edges[0].data['w']) print('第一条边数据:', g_mutil.edges[0].data)一些节点和边的调用方法:
#所有的边 print(g_mutil.edges()) #所有的边 print(g_mutil.nodes()) #根据节点找边 eid_10 = g_mutil.edge_id(1, 0, return_array=True) print(eid_10) g_mutil.edges[eid_10].data['w'] = th.ones(len(eid_10), 2) print(g_mutil.edata['w']) nx.draw(g_mutil.to_networkx(), with_labels=True) plt.show()