IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 简单讲解torch.sparse.LongTensor -> 正文阅读

[人工智能]简单讲解torch.sparse.LongTensor

前言

import torch

当一个tensor有特别多0的时候,我们可以使用稀疏矩阵来存储,大家可能都听过的库是sicpy,不过,本文要讲的是torch。

构造

有大量0元素的时候,我们可以使用坐标形式存储稀疏矩阵,例如我们有一个3*3的矩阵,但是只有0,0处有值,值为1,其他地方全为0,那么我们只需要如下做即可:

i = torch.LongTensor([[0],
                          [0]])
v = torch.FloatTensor([1])
a=torch.sparse.FloatTensor(i, v, torch.Size([3,3]))
a

在这里插入图片描述
解释:

  1. nnz means: number of non zero elements.即非0元素个数。
  2. 布局就是稀疏矩阵存储格式,我们这里是坐标形式,即coordinate,这个和scipy一样。

注意,我们的稀疏张量格式允许uncoalesced(未合并) 的稀疏张量, 什么意思?如下:

i = torch.LongTensor([[0,0],
                          [0,0]])
v = torch.FloatTensor([1,5])
a=torch.sparse.FloatTensor(i, v, torch.Size([3,3]))
a

在这里插入图片描述
可以发现,坐标0,0处值为1,又为5,非常反直觉。其实,这只是未合并而已,合并的意思就是会加起来,从而变成6,也就是说坐标0,0处的值实际上为6。

a.coalesce()#进行合并操作

在这里插入图片描述
注意,默认情况上,如果按照上述方法来构造稀疏矩阵,那么就是未合并状态uncoalesced=True,而不管你是否有重复的坐标。

属性和运算

a.indices()#查看坐标
a.values()#查看非零值
#注意,这个针对的是coalesced的稀疏矩阵才可以。
a._indices()#前面加一个_,这个不需要合并的稀疏矩阵,其会原样返回构造时候的索引。
a.to_dense()#将稀疏tensor转化为稠密tensor。
a *= 1000#所有值乘以1000.
a +=1000#这个不允许,因为加1000需要每一个元素都加,直接就破坏了稀疏矩阵结构了,原来0的现在变成了非0.

tensor([[1., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])

两个稀疏矩阵相减,这个也比较容易实现,合并两者的坐标,然后相减即可,如下:

i = torch.LongTensor([[0,0],
                          [0,1]])
v = torch.FloatTensor([1,5])
a=torch.sparse.FloatTensor(i, v, torch.Size([3,3]))
i = torch.LongTensor([[0,0],
                          [0,2]])
v = torch.FloatTensor([1,4])
b=torch.sparse.FloatTensor(i, v, torch.Size([3,3]))
a-b

tensor(indices=tensor([[0, 0, 0],
[0, 1, 2]]),
values=tensor([ 0., 5., -4.]),
size=(3, 3), nnz=3, layout=torch.sparse_coo)

同理,两个稀疏矩阵相加,也是比较容易实现的(因为加法和减法本质上一样),而且此时会重新排列那个indices,排列准则是坐标中的x坐标,从小到大排列。

上面说完了加减乘除,其他的还有按照某个维度求和:

torch.sparse.sum(a,dim=1)

这个也是比较容易实现的,因为只需要找到每一行的索引以及值,然后相加即可。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:22:35  更:2022-04-09 18:25:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:42:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码