【知识】DGL中graph默认的稀疏矩阵格式和coo格式不对的坑

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn]

如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~


目录

先给结论

源码解读

代码验证


网上没找到相关的讨论,因此只能从源码上一步步查。

先给结论

  • 对于自己使用dgl.graph接口创建的图,如果不指定格式就默认用coo,指定的话支持coo、csr、csc;
  • 对于dgl的数据集,则取决于数据集的npz文件中指定的格式,或数据集自己的处理方式

源码解读

1、先看一下是如何构建图的:

方法一:使用数据集接口

方法二:自己手动构建图

# https://docs.dgl.ai/en/0.8.x/generated/dgl.graph.html?highlight=graph#dgl.graph

# 创建一个简单的有向图,边由列表指定
g = dgl.graph(([0, 1, 2], [1, 2, 3]))  

# 用 CSR 表示法和边 ID 创建相同的图。
g = dgl.graph(('csr', ([0, 0, 0, 1, 2, 3], [1, 2, 3], [0, 1, 2])))

剧透:实际上数据集接口内部调用的方式与dgl.graph很像)

2、先看构图函数:dgl.convert.graph

3、再看被调用的函数:dgl.utils.data.graphdata2tensors

        因此,得出结论:对于自己使用dgl.graph接口创建的图,如果不指定格式就默认用coo,指定的话支持coo、csr、csc。

4、再看一下数据集接口方式的,比如yelp:dgl.data.yelp.YelpDataset

        yelp中以读取了coo格式的npz文件

        看一下scipy.sparse._matrix_io.load_npz为什么可以返回coo格式的矩阵。

注意,不要被这里的coo_adj名字骗了哦,哈哈,原因详见后面【代码验证】部分。

        可以发现,矩阵格式实际上是从保存的npz文件里读取的:

        我们可以看save_npz函数的写法,可以发现确实是保存的时候就需要提供的:

         回到yelp,然后使用了dgl.convert.from_scipy将矩阵转为了图g。可以看到,跟graph函数一样,内部也是调用了graphdata2tensors函数:

        我们再看reddit,他也是这样的:

        对于fraud数据集,是先从文件读取矩阵,然后转为了coo:

        因此,得出结论:对于dgl的数据集,则取决于数据集的npz文件中指定的格式,或数据集自己的处理方式

代码验证

dgl.DGLGraph.formats — DGL 0.8.2post1 documentation

对于formats这个函数:

  • 如果 formats 为 None,则返回稀疏格式的使用状态;
  • 否则,可以是'coo'/'csr'/'csc'或它们的子列表,指定要使用的稀疏格式。

        自己用graph接口的方式:

import dgl

g = dgl.graph(([0, 1, 2], [1, 2, 3]))
print(g.formats())
# 输出:{'created': ['coo'], 'not created': ['csr', 'csc']}

g = dgl.graph(('csr', ([0, 0, 0, 1, 2, 3], [1, 2, 3], [0, 1, 2])))
print(g.formats())
# 输出:{'created': ['csr'], 'not created': ['coo', 'csc']}

        数据集接口的方式:

import dgl

dataset = dgl.data.YelpDataset()
g = dataset[0]
print(g.formats())
# 输出:{'created': ['csr'], 'not created': ['coo', 'csc']}

        load_npz中的matrix_format确实是稀疏矩阵格式的名称:

        但这里有个坑,通过debug可以发现,在yelp中虽然变量名叫coo_adj,但实际是csr格式的

        再看一下Reddit,确实又是coo格式的:

import dgl

dataset = dgl.data.RedditDataset()
g = dataset[0]
print(g.formats())
# 输出:{'created': ['coo'], 'not created': ['csr', 'csc']}

        所以需要注意,并非所有数据集总是coo格式的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/766345.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20240702在vmware17.5虚拟机中让ubuntu22.04使用主机的代理上网

20240702在vmware17.5虚拟机中让ubuntu22.04使用主机的代理上网 2024/7/2 14:41 百度:vmware 虚拟机 使用主机代理 上网 https://blog.csdn.net/nomoremorphine/article/details/138738065?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_ba…

Elasticsearch集群部署(上)

目录 前言 一. 环境准备 二. 实施部署 三. 安装配置head监控插件 (只在第一台es部署) 四. Kibana部署(当前还是在第一台es部署) 五. 安装配置Nginx反向代理 六. Logstash部署与测试 前言 1. Elasticsearch: 是…

什么是文档透明加密|好用的文档透明加密软件有哪些?

在当今日益数字化和信息化的时代,数据安全问题愈发受到企业和个人的关注。文档作为信息的重要载体,其安全性不言而喻。为了保障文档的机密性和完整性,文档透明加密技术应运而生。本文将对文档透明加密进行详细介绍,并探讨一些好用…

多模态融合 + 慢病精准预测

多模态融合 慢病精准预测 慢病预测算法拆解子解法1:多模态数据集成子解法2:实时数据处理与更新子解法3:采用大型语言多模态模型(LLMMs)进行深度学习分析 慢病预测更多模态 论文:https://arxiv.org/pdf/2406…

Python中爬虫编程的常见问题及解决方案

Python中爬虫编程的常见问题及解决方案 引言: 随着互联网的发展,网络数据的重要性日益突出。爬虫编程成为大数据分析、网络安全等领域中必备的技能。然而,爬虫编程不仅需要良好的编程基础,还需要面对着各种常见的问题。本文将介绍…

【js + ckeditor】插入base64格式的图片

一、需求说明 直接把图片转成base64插入到富文本 二、需求分析 1、富文本图片格式处理位置 在ckeidtor的目录下有个plugins文件夹,在plugins下新建一个文件夹(自己命名,如simpleupload),进入simpleupload文件夹&…

用MySQL+node+vue做一个学生信息管理系统(四):制作增加、删除、修改的组件和对应的路由

1.下载依赖: npm install vue-router 在src目录下新建一个文件夹router,在router文件夹下新建一个文件router.js文件,在component目录下新建增加删除和修改的组件,引入router.js当中 此时的init组件为主页面((二、三&…

ROS2仿真工具-gazebo

gazebo独立于ROS2,就像插件一样,需要安装。 1.安装 sudo apt install gazebo sudo apt install ros-humble-gazebo-* 2.运行测试demo gazebo /opt/ros/humble/share/gazebo_plugins/worlds/gazebo_ros_diff_drive_demo.world 查看所有话题 ros2 top…

6月份上海二手房卖疯了,暴涨四成,反价房东被抛弃

6月份刚刚结束,北京、上海两大城市的房市成交情况纷纷出炉,从成交量来看上海房市明显比北京火热许多,同时与其他城市类似,消费者偏向于二手房。 6月份上海二手房往前高达2.6万套,环比增加超四成,创下2021年…

Windows下Visual Studio 中配置第一个CUDA工程

今天整NVIDIA 的CUDA 安装和第一个CUDA 代码,顺便添加一个有CUDA工程的空框架。 (1)首先确认自己的CUDA 已经安装成功 >>cmd 进入命令窗,在窗口输入查看cuda 是否安装成功,能查到CUDA的版本号,表示安…

在CenteOs7上安装mysql8.0(Super详细版)

在CenteOs7上安装mysql8.0 为什么用Mysql8.0?如何下载下载地址需要提前准备下载步骤 服务器上安装如何上传到服务器?通过wget下载到服务器并解压 开始安装非必须安装如果全部安装执行顺序 安装完后,启动mysql使用“systemctl”检测mysqld服务…

基于YOLOv10深度学习的CT扫描图像肾结石智能检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

《企业实战分享 · 常用运维中间件》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 近期刚转战 CSDN,会严格把控文章质量,绝不滥竽充数,如需交流&#xff…

《昇思25天学习打卡营第6天|网络构建》

文章目录 前言:今日所学:1. 定义模型类2. 模型层3. 模型参数 前言: 在第六节中我们学习了网络构建,了解了神经网络模型是由神经网络层和Tensor操作构成,我们使用的mindspore.nn中提供了常见的升级网络层的实现&#x…

Spark on k8s 源码解析执行流程

Spark on k8s 源码解析执行流程 1.通过spark-submit脚本提交spark程序 在spark-submit脚本里面执行了SparkSubmit类的main方法 2.运行SparkSubmit类的main方法,解析spark参数,调用submit方法 3.在submit方法里调用doRunMain方法,最终调用r…

Python学习速成必备知识,(20道练习题)!

基础题练习 1、打印出1-100之间的所有偶数: for num in range(1, 101):if num % 2 0:print(num) 2、打印出用户输入的字符串的长度: string input("请输入一个字符串:")print("字符串的长度为:", len(str…

PHP验证日本手机电话号码

首先,您需要了解手机号码的规格。 根据 ,手机和PHS(个人手持电话系统)可以理解为以“070”、“080”和“090”开头的11位数字。 此外,以“050”开头的11位特定IP电话号码也将包含在该目标中。 关于以“060”开头的F…

Git 基础-创建版本库 git init、添加到暂存区git add、查看状态git status、查看改动git diff

1.创建版本库 git init 在目录中创建新的 Git 仓库。 你可以在任何时候、任何目录中这么做,完全是本地化的。 在目录中执行 git init,就可以创建一个 Git 仓库了。 注意: 没事不要手动修改 .git 目录里面的文件,不然改乱了,可能就…

初识Java(复习版)

一. 什么是Java Java是一种面向对象的编程语言,和C语言有所不同,C语言是一门面向过程的语言。偏底层实现,比较注重底层的逻辑实现。不能一味的说某一种语言特别好,每一种语言都是在特定的情况下有自己的优势。 二.Java语言发展史…

Redis哨兵和集群模式

特性哨兵模式集群模式高可用性是是数据分片否是水平扩展否是配置复杂度低高管理复杂度低高多键操作支持是否(有限制) 哨兵模式 原理: Redis 哨兵模式是一种高可用性解决方案,它通过监控 Redis 主从架构,自动执行故障…