基于DGL库图神经网络教程(1)——基本的建图操作
最近接触了图神经网络,感觉这个玩意可以提供多粒度视角。在对研究对象进行抽象后,既可以对节点进行分类,也可以对边进行分类,还可以对图整体进行分类。 图神经网络这种结构就提供一种多粒度描述特定对象的能力。想想还是蛮不错的啊。
所以就搞搞图神经网络。
目前来看图神经网络的理论学习路线有:
- 图论基本知识。这个很熟,不用学。
- 线性代数,尤其是傅里叶变换的矩阵形式。这个只要回去看看书就行,我看了图卷积网络的理论基础,其实就是傅里叶变换矩阵形式的应用,这个在矩阵分析课已经很常见了,不算什么新知识点。但是要接触图神经网络的话,这一部分需要仔细掌握!
- 神经网络相关知识。
大概过了一遍《深入浅出图神经网络》,感觉差不多,还是实操为主。于是写写实践方面的东西。
图神经网络库
本人用的库是DGL :https://docs.dgl.ai/index.html
github地址:https://github.com/dmlc/dgl
这个库好像是纽约大学写的。它里面实现了目前常见的图神经网络模型,直接搭积木一样构造网络,然后构造好数据就可以了。
安装DGL库
无cuda安装:
pip3 install dgl -i https://mirrors.aliyun.com/pypi/simple/
cuda10安装:
python3 -m pip install dgl-cu100 -i https://mirrors.aliyun.com/pypi/simple/
DGL默认使用pytorch作为底层神经网络库
教程
加节点、加边、及可视化图
DGL里面的边都是有向边,对于无向边,可以同时建立两边反向边。
__author__ = 'dk'
#构建图,添加节点和边
import networkx as nx
import dgl
import matplotlib.pyplot as plt
#构建星型图
u=[0,0,0,0,0]
v=[1,2,3,4,5]
#第一种方式,u和v的数组,他们是相同的长度
star1 = dgl.DGLGraph((u,v))
nx.draw(star1.to_networkx(),with_labels=True)#可视化图
plt.show()star2 = dgl.DGLGraph((0,v))
#对于星型,是可以广播的
nx.draw(star2.to_networkx(),with_labels=True)
plt.show()star3= dgl.DGLGraph([(0,1),(0,2),(0,3),(0,4),(0,5)])
#直接枚举
nx.draw(star3.to_networkx(),with_labels=True)
plt.show()
也可以后续加边,而不是在构造函数里面加边:
#也可以边构图,边加边,而不是在构造函数里面加边
g = dgl.DGLGraph()#这是一张空白图
g.add_nodes(9)#添加节点,注意一定要先加节点,后加边
for i in range(1,8):g.add_edge(0,i)
nx.draw(g.to_networkx(),with_labels=True)
plt.show()
注意! 添加边(u,v)的时候,u和v不能超过网络已经拥有的最大节点ID(节点数减1),对于多余的没有出入度的节点,DGL认为他们是孤立的。
比如上图:8号节点是没有变跟它连接的。
节点特征的赋值、提取
建立好图后,就可以给节点加特征了。
在DGL里面,节点的特征是被当做字典来处理的。用户可以给节点的特征取一个有表征意义的key_name,同时用户也可以给一个node同时定义多个特征。
比如上面的星型模型:
import numpy as np
features = np.random.normal(0,1,(9,5)) #随机生成一个9x5的正态分布矩阵
print(features)
g.ndata['features'] = features
输出:
[[-0.73241917 0.78738566 1.21160063 -0.83944648 -0.15739715][-0.05520377 0.83418124 -0.68477259 -1.29054549 -1.2375015 ][-0.23807425 -0.40030208 1.74318389 -0.70699831 -0.61449034][-0.48597221 0.65284435 -0.27101916 -0.69242791 -0.83134013][-0.00580359 1.29773141 1.28545031 -0.41703836 0.97254182][-1.19173936 1.18409306 -0.24284504 -1.93560515 -1.1080128 ][-0.4854841 0.06257814 -1.3432515 -0.53297016 -0.01270537][-0.16906863 0.17349874 1.0057332 1.85554737 0.13355367][-1.45619866 0.77784642 1.52454762 -0.86608947 0.28595569]]
ndata属性就是node-data的缩写。它是一个dict。
注意features的行数需要和图目前拥有的节点数一致。
否则报错:
dgl._ffi.base.DGLError: Expect number of features to match number of nodes (len(u)). Got 7 and 9 instead.
访问节点特征:
直接g.ndata[特征名][节点ID] 就可以:
例如:访问节点3的特征
print(g.ndata['features'][3])
输出:就是features矩阵的第三行
tensor([-0.4860, 0.6528, -0.2710, -0.6924, -0.8313], dtype=torch.float64)
当然可以修改某个节点的特征:
g.ndata['features'][3]=th.zeros(1,5)
print(g.ndata['features'][3])
输出:
tensor([0., 0., 0., 0., 0.], dtype=torch.float64)
可以看出,DGL内部用一个张量来存储节点特征。节点特征的修改、访问最后落实到对这个矩阵的修改、访问。
print(g.ndata)
输出:
{'features': tensor([[-0.4771, 1.7900, -1.1160, 0.2916, -0.7986],[-1.6190, -0.5006, -0.0437, 1.6412, -1.6979],[ 1.8872, 0.5236, 0.5123, -0.7658, -0.5050],[ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000],[-0.3382, -0.4218, 0.8622, 1.1720, 0.3460],[-0.1710, 0.2713, -0.1639, -1.1159, -0.3623],[-0.9241, 1.2943, 0.1137, 1.5348, 0.1791],[-1.0372, 1.4145, -2.0653, -0.1469, -0.6041],[ 0.1035, -1.4215, 0.3288, -0.5195, -1.4120]], dtype=torch.float64)}
边特征的赋值和访问、修改
与节点特征一样,边也可以指定特征以及访问、修改特征
赋值:
g.edata['w']=th.randn(len(g.edges),2)
注意,赋值矩阵的行函数需要等于边的数目
访问某条边的特征,最终需要落实到访问边矩阵里面的某一行。而到底是那一行,则是边的ID。
因此需要确定,我们访问的边的ID是多少。
比如:获取(0,7)这条边的ID:
g.edge_id(0,7)
访问这条边的特征:
g.edata(g.edge_id(0,7))
然后也可以删除特征:这其实就是字典的操作
g.ndata.pop('features')
g.edata.pop('w')
基于DGL库图神经网络教程(1)——基本的建图操作相关推荐
- walking机器人入门教程-视觉转激光建图-cartographer算法建图
系列文章目录 walking机器人入门教程-目录 walking机器人入门教程-硬件清单 walking机器人入门教程-软件清单 walking机器人入门教程-测试底盘 walking机器人入门教程- ...
- 图神经网络的过平滑问题和图残差网络
图神经网络的过平滑问题和图残差网络 在GNN的深度堆叠中存在两大问题:梯度消失和过平滑.梯度消失是经典神经网络中就会出现的问题,也就是当网络层数堆叠地过多,前面的层梯度过小难以更新:另一个问题就是之前 ...
- 视觉进阶|计算机视觉及其后的图神经网络教程(第一部分)
概述 我在本文将回答那些不熟悉图或图神经网络的AI/ML/CV的用户通常会问的问题.我提供了Pytorch的例子来澄清这种相对新颖和令人兴奋的模型背后的思路. 问题 我在本部分教程中提出的问题是: 为 ...
- 图神经网络代码_第一篇:图神经网络(GNN)计算框架绪论
写在开头: 这个专栏是为了总结我本科毕业设计中所设计的题目<基于GPU的图神经网络算法库的设计钰实现>.这半年来一直在这个方向上啃代码,读论文,真的学到了很多东西.尤其是阅读了大佬团队写的 ...
- 【图神经网络实战】深入浅出地学习图神经网络GNN(上)
文章目录 一.图神经网络应用领域 1.1 芯片设计 1.2 场景分析与问题推理 1.3 推荐系统 1.4 欺诈检测与风控相关 1.5 知识图谱 1.6 道路交通的流量预测 1.7 自动驾驶(无人机等场 ...
- ROS 教程2 机器人雷达建图 蒙特卡洛定位 导航 路径规划 仿真
ros 机器人雷达建图 蒙特卡洛定位 导航 路径规划 仿真 move_base gmapping acml 博文github 一.安装 turtlebot 移动机器人底座 进行导航 1.安装系统依赖 ...
- 图神经网络笔记(二)——卷积图神经网络概述
文章目录 基于谱分解的方法 Spectral Network ChebNet GCN AGCN(Adaptive GCN) 基于空间结构的方法 Neural FP PATCHY-SAN DGCN LG ...
- 从零搭建一台基于ROS的自动驾驶车-----3.激光Slam建图
系列文章目录 北科天绘 16线3维激光雷达开发教程 基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图 Nvidia Jetson Nano学习笔记–串口通信 Nvidia Jet ...
- 【图神经网络实战】深入浅出地学习图神经网络GNN(下)
文章目录 一.Graph Attention Network 1.1 图注意力机制作用与方法 1.2 Attention计算 1.3 Graph Attention 做了什么 二.序列图神经网络TGC ...
最新文章
- Sql Server函数全解(二)数学函数
- 系统级性能分析工具perf的介绍与使用
- 042_JDK的Map接口
- Ansible中的角色使用
- oracle数据库抽取到gp,Oracle迁移数据到Greenplum
- 音频处理入门笔记(技术英文缩写)
- 机器视觉的发展现状和前景分析
- MyCat分片规则之枚举分片
- 全面了解浏览器(内核)发展史
- java异常栈_简单看java异常栈
- python从srt文件中只提取歌词
- WPF3D贴图:用C#搓一个地球
- /usr/bin/ld: /tmp/ccIHWHTn.o: in function `Cdisk::Cdisk()‘:编译报错解决方案
- canvas里 阿里云服务器oss图片跨域处理
- pip install av 无法安装
- iOS——越狱与免证书调试
- 题目 - 北京地铁 描述 北京地铁涨价了,现在的地铁票价计算方法如下: 6公里内 3元 (包括6公里) 6-12 公里 4元 (不包括6公里,包括12公里) 12-32 公里 每10公里加1元
- 计算机怎么重装win7,如何重装电脑系统win7,最新电脑重装系统教程
- 计算机发明者的电影,电脑发明的奠基人之一,你了解他的生平吗?这部电影带你走近天才...
- 安卓玩机搞机技巧综合资源-----查看手机硬件全部参数 隐藏参数 多个软件【十七】
热门文章
- 低代码平台和专业开发人员——完美搭档?
- Linux上使用腾讯QQ与TIM
- (FortiGate)飞塔防火墙过滤指定会话并清理
- 计算机报名照片最小像素高宽,网上报名照片如何确定大小
- Python统计学01——数据可视化
- 为了追求梦想,真正的LabVIEW的编程大神离职了!
- wifi连接一段时间才能上网_Win7系统下连接wifi一段时间就自动断线怎么办【图文】...
- WIN10下用anaconda安装tensorflow-gpu1.8.0并用pycharm作编译器(WIN10下anaconda+tensorflow-gpu+pycharm)
- c#程序设计语言杜松江版_清华大学出版社-图书详情-《C#语言Windows程序设计(第2版)》...
- Usb rndis,mtp等function添加,config配置