同学你好!本文章于2021年末编写,获得广泛的好评!
故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现,
Pytorch深度学习·理论篇(2023版)目录地址为:
CSDN独家 | 全网首发 | Pytorch深度学习·理论篇(2023版)目录本专栏将通过系统的深度学习实例,从可解释性的角度对深度学习的原理进行讲解与分析,通过将深度学习知识与Pytorch的高效结合,帮助各位新入门的读者理解深度学习各个模板之间的关系,这些均是在Pytorch上实现的,可以有效的结合当前各位研究生的研究方向,设计人工智能的各个领域,是经过一年时间打磨的精品专栏!https://v9999.blog.csdn.net/article/details/127587345欢迎大家订阅(2023版)理论篇
以下为2021版原文~~~~
1 DGLGraph图的创建与维护
1.1 生成DGLGraph图并且增加顶点与边
import dgl
import torch as th# 边 0->1, 0->2, 0->3, 1->3
u, v = th.tensor([0, 0, 0, 1]), th.tensor([1, 2, 3, 3])
g = dgl.graph((u, v))print(g) # 图中节点的数量是DGL通过给定的图的边列表中最大的点ID推断所得出的
# 获取节点的ID
print(g.nodes())
# 获取边的对应端点
print(g.edges())
# 获取边的对应端点和边ID
print(g.edges(form='all'))
# 如果具有最大ID的节点没有边,在创建图的时候,用户需要明确地指明节点的数量。
g = dgl.graph((u, v), num_nodes=8)
1.2 获得DGLGraph图的顶点与边
import dgl
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文字符
mpl.rcParams['font.family'] = 'STSong'
mpl.rcParams['font.size'] = 40
g_dgl = dgl.DGLGraph() # 生成一个空图
g_dgl.add_nodes(4) # 增加四个顶点
g_dgl.add_edges(list(range(4)),[0]*4) # 增加四条边
print("顶点",g_dgl.nodes()) # 输出顶点列表
print("边:",g_dgl.edges()) # 输出边
print("边索引",g_dgl.edge_id(1,0)) # 输出边索引
print("边属性",g_dgl.edges[g_dgl.edge_id(1,0)]) # 输出边属性
顶点 tensor([0, 1, 2, 3])
边: (tensor([0, 1, 2, 3]), tensor([0, 0, 0, 0]))
边索引 1
边属性 EdgeSpace(data={})
1.3 删除DGLGraph图的顶点与边
g_dgl.remove_edges(i) # 删除索引值为i的边
print(g_dgl.number_of_edges()) # 输出图的边数
1.4 清空DGLGraph图
g_dgl.clear() # 清空图内容
2 查看DGLGraph图中的度
DGLGraph图按照边的方向将度分为两种:连接其他顶点的度(out)和被其他顶点连接的度。
- in_degree:查询指定顶点被连接的边数。
- in_degrees:查询多个顶点被连接的边数,默认查询图中的全部顶点。
- out_degree:查询指定顶点连接其他顶点的边数。
- out_degrees:查询多个顶点连接其他顶点的边数,默认查询图中的全部顶点。
2.1 代码实战:查看DGLGraph图中的度
import dgl
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文字符
mpl.rcParams['font.family'] = 'STSong'
mpl.rcParams['font.size'] = 40
g_dgl = dgl.DGLGraph() # 生成一个空图
g_dgl.add_nodes(4) # 增加四个顶点
g_dgl.add_edges(list(range(4)),[0]*4) # 增加四条边
print(g_dgl.in_degree(0)) # 查询连接0顶点的度,输出:4
print(g_dgl.in_degrees([0,1])) # 查询连接0,1顶点的度,输出:tensor([4, 0])
print(g_dgl.in_degrees()) # 查询全部顶点被连接的度,输出:tensor([4, 0, 0, 0])
print(g_dgl.out_degrees()) # 查询全部顶点向外连接的度,输出:tensor([1, 1, 1, 1])
3 DGLGraph图与NetWorkx图的相互转化
DGLGraph类在NetWorkx模块之上进行扩展
3.1 将DGLGraph图转成NetWorkx图并显示
将DGLGraph图转成NetWorkx图后便可以借助NetWorkx图的显示功能来可视化其内部结构。
import dgl
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文字符
mpl.rcParams['font.family'] = 'STSong'
mpl.rcParams['font.size'] = 40
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'g_dgl = dgl.DGLGraph() # 生成一个空图
g_dgl.add_nodes(4) # 增加四个顶点
g_dgl.add_edges(list(range(4)),[0]*4) # 增加四条边nx.draw(g_dgl.to_networkx(),with_labels=True) # 先调用to_networkx()方法,将DGLGraph图转成NetWorkx图,再调用NeWorkx的draw()方法进行显示。#### Networkx库中对图的可视化没有自环图的功能
3.2 利用NetWorkx图创建DGLGraph图
DGLGraph图可以从NetWorkx图中转化而来。
3.2.1 代码实战:利用NetWorkx图创建DGLGraph图
先调用dgl.DGLGraph()将NetWorkx图转化为DGLGraph图,再调用了DGLGraph图对象的to_networkx()方法,将DGLGraph图转换为NetWorkx图显示。
import dgl
import networkx as nx
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文字符
mpl.rcParams['font.family'] = 'STSong'
mpl.rcParams['font.size'] = 40
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'g_nx = nx.petersen_graph() # 创建一个Networkx类型的无向图petersen
g_dgl = dgl.DGLGraph(g_nx) # 将Networkx类型转化为DGLGraph
plt.figure(figsize=(20,6))
plt.title("Networkx无向图",fontsize=20)
nx.draw(g_nx,with_labels=True)
plt.subplots(122)
plt.title("DGL有向图",fontsize=20)
nx.draw(g_dgl.to_networkx(),with_labels=True) # 将DGLGraph转化为Networkx类型的图
4 DGLGraph图中顶点属性的操作
4.1 为图添加节点特征和边特征
许多图数据包含节点和边上的属性,即节点特征和边特征。虽然节点特征和边特征的类型在现实世界中可以是任意的,但是DGLGraph只接受存储在张量(Tensor)中的属性,且该属性必须为数值类型。
4.2 修改顶点属性
4.3 删除顶点属性
DGL库官方操作指南https://docs.dgl.ai/