DGL的图数据结构的创建、图的特征、dgl.batch及一些理解

2023-10-20 17:40

本文主要是介绍DGL的图数据结构的创建、图的特征、dgl.batch及一些理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、创建图
    • 1.dgl.graph((u, v))
    • 2.dgl.graph((tuple)...)
  • 二、理解图
    • 1.边和节点的特征赋值与查看
    • 2.图的一些属性或方法
    • 3.DGL中的Batch


前言

dgl是图神经网络构建的工具。官方文档:https://docs.dgl.ai/guide_cn/graph-basic.html#guide-cn-graph-basic有中文的文档,很贴心。

一、创建图

1.dgl.graph((u, v))

我只说一下我目前用过的方式,还有许多方式可以看官方文档。

import torch as th
import dgl
u, v = th.tensor([0, 0, 0, 1]), th.tensor([1, 2, 3, 3])
g = dgl.graph((u, v))
print(g)

输出:
在这里插入图片描述
图已经创建完成了,相信你第一眼肯定会觉得很抽象,这图是什么样子呢?
我们可以可视化一下:(我这里用的是jupyter文件格式.ipynb

import networkx as nx
%matplotlib inline
nx_G = g.to_networkx()
pos = nx.kamada_kawai_layout(nx_G)
nx.draw(nx_G, pos, with_labels=True, node_color=[[.7, .7, .7]])

输出:
在这里插入图片描述
可视化出来应该就很好理解了

u, v = th.tensor([0, 0, 0, 1]), th.tensor([1, 2, 3, 3])

u和v都是图的节点,分别是一一对应创建边的关系。因为树就是特殊的图,其实用这个数据结构构建树也十分容易。

2.dgl.graph((tuple)…)

这个方法我感觉还是比较实用的,尤其是创建树结构的时候。

import torch as th
import dgl
u = [0, 0, 0, 1]
v = [1, 2, 3, 3]
u_v = []
for u, v in zip(u, v):u_v.append((u,v))
g = dgl.graph(u_v)
print(g)

在这里插入图片描述
结果是一样的。
还有其他一些方法可以参考一下官方文档,或者别人写的这篇博客也蛮好的跟着官方文档学DGL框架第二天——DGLGraph和节点/边特征

二、理解图

还是用刚刚造的那张图。

import torch as th
import dgl
u, v = th.tensor([0, 0, 0, 1]), th.tensor([1, 2, 3, 3])
g = dgl.graph((u, v))

1.边和节点的特征赋值与查看

dgl的图中,每个边和节点都能够赋值特征,从而实现图神经网络的计算。

import torch as th
import dgl
u, v = th.tensor([0, 0, 0, 1]), th.tensor([1, 2, 3, 3])
g = dgl.graph((u, v))# 每个节点赋值特征
g.ndata['x'] = th.randn(g.num_nodes(), 3)  # 长度为3的节点特征
g.ndata['mask'] = th.randn(g.num_nodes(), 3)  # 节点可以同时拥有不同方面的特征
g.edata['x'] = th.ones(g.num_edges(), dtype=th.int32) # 每个边赋值特征
print(g)print(g.ndata["x"][0])
print(g.edata["x"][0])

输出:
在这里插入图片描述

2.图的一些属性或方法

import torch as th
import dgl
u, v = th.tensor([0, 0, 0, 1]), th.tensor([1, 2, 3, 3])
g = dgl.graph((u, v))print(g.nodes())  # 获取节点的ID
print(g.edges())  # 获取边的对应端点
print(g.edges(form='all'))  # 获取边的对应端点和边ID
print(g.number_of_nodes())  # 获取所有节点的数量
print(g.number_of_edges())  # 获取所有边的数量

在这里插入图片描述

3.DGL中的Batch

当我们训练深度学习模型时,都会打包成一个batch去更新模型的参数,图神经网络也不例外。但是当许多子图打包之后,每个子图的节点会重新标号。
举个例子就懂了:

import torch as th
import dgl
u, v = th.tensor([0, 0, 0, 1]), th.tensor([1, 2, 3, 3])
u1, v1 = th.tensor([0, 1, 2, 3]), th.tensor([2, 3, 4, 4])
u2, v2 = th.tensor([0, 0, 2, 3]), th.tensor([2, 3, 3, 1])
g = dgl.graph((u, v))
g1 = dgl.graph((u1, v1))
g2 = dgl.graph((u2, v2))
import networkx as nx
%matplotlib inline

然后运行(画第一张图)

nx_G = g.to_networkx()
pos = nx.kamada_kawai_layout(nx_G)
nx.draw(nx_G, pos, with_labels=True, node_color=[[.6, .7, .7]])

在这里插入图片描述
再运行(画第二张图)

nx_G = g1.to_networkx()
pos = nx.kamada_kawai_layout(nx_G)
nx.draw(nx_G, pos, with_labels=True, node_color=[[.6, .7, .7]])

在这里插入图片描述
最后运行(画第三章图)

nx_G = g2.to_networkx()
pos = nx.kamada_kawai_layout(nx_G)
nx.draw(nx_G, pos, with_labels=True, node_color=[[.6, .7, .7]])

在这里插入图片描述
然后我们再将这三个子图,打包成一个Batch然后可视化出来

graphs = [g, g1, g2]  # 图的列表
graph = dgl.batch(graphs)  # 打包成一个batch的大图nx_G = graph.to_networkx()
pos = nx.kamada_kawai_layout(nx_G)
nx.draw(nx_G, pos, with_labels=True, node_color=[[.6, .7, .7]])

在这里插入图片描述
可以发现变成大图之后,子图的节点序号重新标号了。且顺序就是按照图列表的顺序来的。

这篇关于DGL的图数据结构的创建、图的特征、dgl.batch及一些理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/248645

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念