关于Pytorch和Numpy中的稀疏矩阵sparse的知识点

Pytorch和Numpy中的稀疏矩阵sparse

  • 0 稀疏矩阵类别
    • 0.1 coo_matrix
    • 0.2 dok_matrix
    • 0.3 csr_matrix
    • 0.4 csc_matrix
    • 0.5 bsr_matrix
    • 0.6 bsc_matrix
    • 0.7 lil_matrix
    • 0.8 dia_matrix
  • 1 pytorch中的稀疏矩阵
    • 1.1 to_sparse()
    • 1.2 to_sparse_csr()
    • 1.3 sparse_coo_tensor()
    • 1.4 sparse_csr_tensor()
    • 1.5 sparse.sum()
    • 1.6 sparse.mm()
  • 2 numpy中的稀疏矩阵
  • 参考博文及感谢

写在前面,pytorch和numpy都有对稀疏矩阵的操作,最大的区别在于pytorch可以通过GPU进行加速;不过现在numpy这边也推出了智能AI来加速对稀疏矩阵的运算;下面就稍微梳理一下关于稀疏矩阵的相关知识点,以飨诸君~

0 稀疏矩阵类别

不管是pytorch还是numpy,他们对稀疏矩阵的处理都是根据稀疏矩阵类别来的;所以先简单介绍稀疏矩阵的类别,这里网上已经有大量针对这些类别的详细解释说明,我这边就做引用:

SciPy 中不同稀疏矩阵存储方式介绍 (这个博客经常更换地址,而且加载不出图;但是是原创,所以贴出来);
不同稀疏矩阵存储方式介绍(这是对上面博客的CSDN转载,可看图)。

0.1 coo_matrix

对角存储矩阵(Coordinate Matrix)的简称
优:
能与CSR / CSC格式的快速转换

(tobsr()、tocsr()、to_csc()、to_dia()、to_dok()、to_lil()

缺:
不支持切片和算术运算操作

0.2 dok_matrix

按键字典矩阵(Dictionary of Keys Matrix)的简称
优:
对于递增的构建稀疏矩阵很高效,比如定义该矩阵后,想进行每行每列更新值,可用该矩阵。
可以高效访问单个元素,只需要O(1)
缺:
不允许重复索引(coo中适用),但可以很高效的转换成coo后进行重复索引

0.3 csr_matrix

压缩稀疏行矩阵(Compressed Sparse Row Matrix )的简称
优:
高效的稀疏矩阵算术运算
快速地矩阵矢量积运算

缺:
转换到稀疏结构代价较高(可以考虑LIL,DOK)

0.4 csc_matrix

压缩稀疏列矩阵(Compressed Sparse Column Matrix )的简称
优缺:
同上

0.5 bsr_matrix

分块压缩稀疏行矩阵(Block Sparse Row Matrix )的简称
优:
更适合于适用于具有密集子矩阵的稀疏矩阵

0.6 bsc_matrix

分块压缩稀疏列矩阵(Block Sparse Column Matrix )的简称
优:
更适合于适用于具有密集子矩阵的稀疏矩阵

0.7 lil_matrix

链表矩阵(Linked List Matrix )的简称
优:
适合递增的构建成矩阵
转换成其它存储方式很高效
支持灵活的切片
缺:
算术操作,列切片,矩阵向量内积操作慢(考虑用coo)

0.8 dia_matrix

对角存储矩阵(Diagonal Matrix)的简称

1 pytorch中的稀疏矩阵

先上官网开发文档镇楼TORCH.SPARSE 1.13 开发文档。
值得说明的是目前pytorch 只支持 COO, CSR, CSC, BSR, 和 BSC五种矩阵,可以用numpy转完在用pytorch。

这里首先讲pytorch而不是numpy的原因是pytorch确实比numpy快,具体看这里这个测试numpy, torch.spmm和torch.spmm 速度测试;
常用的方法有如下

1.1 to_sparse()

a = torch.tensor([[0, 2.], [3, 0]])
a.to_sparse()

官网有例子,不再重复造轮子;

1.2 to_sparse_csr()

1.3 sparse_coo_tensor()

1.4 sparse_csr_tensor()

crow_indices = torch.tensor([0, 2, 4])
col_indices = torch.tensor([0, 1, 0, 1])
values = torch.tensor([1, 2, 3, 4])
csr = torch.sparse_csr_tensor(crow_indices, col_indices, values, dtype=torch.float64)
csr
"""
tensor(crow_indices=tensor([0, 2, 4]),col_indices=tensor([0, 1, 0, 1]),values=tensor([1., 2., 3., 4.]), size=(2, 2), nnz=4,dtype=torch.float64)
"""
csr.to_dense()
"""
tensor([[1., 2.],[3., 4.]], dtype=torch.float64)
"""

1.5 sparse.sum()

1.6 sparse.mm()

这里提一句,torch.sparse.mm()和torch.spmm()是一样的,映射到的底层函数函数一样;具体可看这个numpy, torch.spmm和torch.spmm 稀疏矩阵乘法 测试;

2 numpy中的稀疏矩阵

照例搬出官方文档镇楼,Sparse matrices 1.11.4 官方文档
numpy是高性能科学计算和数据分析的基础包,其对稀疏矩阵的操作主要依赖于scipy开发包。

此处仍然引开篇的博客SciPy 中不同稀疏矩阵存储方式介绍

关于使用智能AI来加速对稀疏矩阵的运算,可参考此链接一行代码加速 sklearn 运算上千倍

PS:如果对numpy中的方法不熟,可以看这篇博客NumPy:数组批量计算

再贴一个numpy稀疏矩阵转pytorch的代码:

def sparse_mx_to_torch_sparse_tensor(sparse_mx):"""Convert a scipy sparse matrix to a torch sparse tensor."""if type(sparse_mx) != sp.coo_matrix:sparse_mx = sparse_mx.tocoo().astype(np.float32)indices = torch.from_numpy(np.vstack((sparse_mx.row, sparse_mx.col)).astype(np.int64))values = torch.from_numpy(sparse_mx.data).float()shape = torch.Size(sparse_mx.shape)return torch.sparse.FloatTensor(indices, values, shape)

参考博文及感谢

部分内容参考以下链接,这里表示感谢 Thanks♪(・ω・)ノ
参考博文1 Pytorch 关于稀疏矩阵 1.13 官方开发文档
https://pytorch.org/docs/1.13/sparse.html?highlight=sparse#module-torch.sparse
参考博文2 Numpy 关于稀疏矩阵 Sparse matrices 1.11.4 官方文档
https://docs.scipy.org/doc/scipy/reference/sparse.html
参考博文3 SciPy 中不同稀疏矩阵存储方式介绍
https://dreamhomes.github.io/posts/202012311027/
参考博文4 不同稀疏矩阵存储方式介绍
https://blog.csdn.net/DreamHome_S/article/details/111994423
参考博文5 numpy, torch.spmm和torch.spmm 稀疏矩阵乘法测试
https://github.com/rusty1s/pytorch_sparse/issues/356
参考博文6 一行代码加速 sklearn 运算上千倍
https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/125382907

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java新人入职管理系统

基于Java新人入职管理系统 功能需求 1、个人信息管理:系统需要提供个人信息管理功能,包括新人的基本信息、联系方式、教育背景、工作经历等。 2、入职流程管理:系统需要提供入职流程管理功能,包括入职手续的办理、合同签订、入…

【JavaEE学习】初识进程概念

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得,欢迎大家在评论区交流讨论💌 目录 一、…

AI:ElasticSearch

ElasticSearch是一款开源的分布式搜索引擎和数据分析引擎,主要用于处理海量数据并提供近实时的搜索和分析功能。它具有全文检索、结构化检索和数据分析等特点,能够满足各种复杂的搜索需求。ElasticSearch使用Java编写,可以运行在多个服务器上…

python:五种算法(GA、OOA、DBO、SSA、PSO)求解23个测试函数(python代码)

一、五种算法简介 1、遗传算法GA 2、鱼鹰优化算法OOA 3、蜣螂优化算法DBO 4、麻雀搜索算法SSA 5、粒子群优化算法PSO 二、5种算法求解23个函数 (1)23个函数简介 参考文献: [1] Yao X, Liu Y, Lin G M. Evolutionary programming made…

C++中使用汇编

在 C 中编写汇编代码通常需要使用内嵌汇编(inline assembly)的方式。内嵌汇编允许将汇编代码直接嵌入到 C 代码中,以实现对底层硬件的直接访问和控制。下面是详细解释和示例说明如何在 C 中写汇编代码: 使用内嵌汇编的语法&#x…

百度文库下载要用券?Kotlin爬虫几步解决

百度作为国内知名的网站,尤其是文库里面有各种丰富的内容,对我们学习生活都有很大的帮助,就因为其内容丰富,如果看见好用有意思的文章还用复制粘贴等方式就显得有点落后了,今天我将用我所学的爬虫知识给你们好好上一课…

基于51单片机的语音识别控制系统

0-演示视频 1-功能说明 (1)使用DHT11检测温湿度,然后用LCD12864显示,语音播放,使用STC11l08xe控制LD3320做语音识别, (2)上电时语音提示:欢迎使用声音识别系统&#xf…

go-zero开发入门之网关往rpc服务传递数据

go-zero 的网关往 rpc 服务传递数据时,可以使用 headers,但需要注意前缀规则,否则会发现数据传递不过去,或者对方取不到数据。 go-zero 的网关对服务的调用使用了第三方库 grpcurl,入口函数为 InvokeRPC: …

【vue实战项目】通用管理系统:信息列表,信息的编辑和删除

本文为博主的vue实战小项目系列中的第七篇,很适合后端或者才入门的小伙伴看,一个前端项目从0到1的保姆级教学。前面的内容: 【vue实战项目】通用管理系统:登录页-CSDN博客 【vue实战项目】通用管理系统:封装token操作…

实验制备高纯酸PFA酸纯化器材质分析,SCH亚沸蒸馏器特点是什么

.酸纯化器:也称酸蒸馏器、高纯酸提取系统、酸纯化系统、亚沸腾蒸馏器、高纯酸蒸馏纯化器。常规实验室分析中,各种酸及试剂被广泛应用于日常的样品处理及分析中。那么应该选用什么材质的酸纯化器呢 氟塑料酸纯化器,提纯酸效果好,避…

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(四)

目录 前言引言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建3. 模型训练及保存4. 模型生成 系统测试1. 训练准确率2. 测试效果 相关其它博客工程源代码下载其它资料下载 前言 博主前段时间发布了一篇有关方言识别和分类模型训练的博客&#xff…

蓝桥杯小白赛第一场(1~6)(期望DP)

1、模拟 2、贪心 3、前缀和 4、猜结论 5、双指针 6、期望DP 1. 蘑菇炸弹 思路&#xff1a;一个简单的暴力模拟。 #include <bits/stdc.h> using namespace std; int main() {int n;cin >> n;vector<int>a(n , 0);for(int i 0 ; i < n ; i )cin &…

智能优化算法应用:基于群居蜘蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于群居蜘蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于群居蜘蛛算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.群居蜘蛛算法4.实验参数设定5.算法结果6.…

Linux---Ubuntu操作系统

1. Ubuntu操作系统的介绍 Ubuntu操作系统是属于Linux操作系统中的一种&#xff0c;它是免费、稳定又可以拥有绚丽界面的一个操作系统 2. Ubuntu图形界面的介绍 任务栏 窗口操作按钮 窗口菜单条 任务栏效果图: 窗口操作按钮效果图: 窗口菜单条效果图: 3. 与Windows目录结…

嵌入式系统复习--ARM技术概述

文章目录 上一篇ARM体系结构Thumb技术介绍ARM处理器工作状态ARM的异常响应过程ARM存储器接口及存储器层次下一篇 上一篇 嵌入式系统复习–概述 ARM体系结构 ARM体系结构的技术特征 ARM的体系结构采用了若干Berkeley RISC处理器的特征 Load/store体系结构固定的32为指令3地址…

django-path函数使用

django.urls.path 是 Django 中用于定义 URL 映射规则的函数之一。它用于创建 URL 模式&#xff0c;将请求的 URL 映射到相应的视图函数或处理器。 基本语法 path(route, view, kwargsNone, nameNone)route: 字符串&#xff0c;表示 URL 的路径。可以包含转换器&#xff08;如…

LSTM 双向 Bi-LSTM

目录 一.Bi-LSTM介绍 二.Bi-LSTM结构 Bi-LSTM 代码实例 一.Bi-LSTM介绍 由于LSTM只能从序列里由前往后预测,为了既能够从前往后预测,也能从后往前预测,Bi-LSTM便被发明了出来。简单来说,BiLSTM就是由前向LSTM与后向LSTM组合而成。 二.Bi-LSTM结构 转自:

5. PyTorch——数据处理模块

1.数据加载 在PyTorch中&#xff0c;数据加载可通过自定义的数据集对象。数据集对象被抽象为Dataset类&#xff0c;实现自定义的数据集需要继承Dataset&#xff0c;并实现两个Python魔法方法&#xff1a; __getitem__&#xff1a;返回一条数据&#xff0c;或一个样本。obj[in…

ros的slam建图和导航(含工作空间)

工作空间的结构 准备工作 创建工作空间&#xff08;ros_zy&#xff09; mkdir ros_zy进入工作空间 cd ros_zy创建src文件夹&#xff08;放源程序&#xff09; mkdir src编译工作空间 catkin_make打开vscode&#xff08;从终端打开此工程&#xff09; code .进入工作空间的…

分页存储管理

页框和页面 将内存空间分为一个个大小相等的分区 (比如:每个分区4KB)&#xff0c;每个分区就是一个“页框”(页框页内存块物理块物理页面)。每个页框有一个编号&#xff0c;即“页框号”(页框号页帧号内存块号物理块号物理页号)&#xff0c;页框号从0开始。 为了将各个进程的数…