参考来源:
CSDN:tensor torch 构造_TORCH.SPARSE
注意:此 API 目前是实验性的,可能会用在以后更新的版本,我目前看的文档是 v1.1.0。
在 TENSOR ATTRIBUTES 中提到,torch.tensor 都有三个属性:dtype、device、layout。
而 layout 支持两种内存布局模式:torch.strided 和 torch.sparse_coo。
Torch 支持 COO(rdinate)格式的稀疏张量,可以有效地存储和处理大多数元素为零的张量。
sparse tensor 可以表示为一对 dense tensors:一个张量的 value 和一个二维的张量 indices;一个稀疏张量可以通过提供这两个张量, 以及稀疏张量的大小来构造(从这些张量是无法推导出来的!)。
假设我们要定义一个稀疏张量, 其中 3 在 (0,2) 处, 4 在 (1,0) 处, 5在 (1,2) 处, 然后我们可以这样写:
import torch
i = torch.LongTensor([[0, 1, 1],
[2, 0, 2]])
v = torch.FloatTensor([3, 4, 5])
A = torch.sparse.FloatTensor(i, v, torch.Size([2, 3]))
B = A.to_dense()
print(A)
print(B)
"""output:
tensor(indices=tensor([[0, 1, 1],
[2, 0, 2]]),
values=tensor([3., 4., 5.]),
size=(2, 3), nnz=3, layout=torch.sparse_coo)
tensor([[0., 0., 3.],
[4., 0., 5.]])
"""
注意,LongTensor 的输入不是索引元组的列表. 如果你想这样写你的指标, 你应该在把它们传递给稀疏构造函数之前进行转置:
import torch
i = torch.LongTensor([[0, 2], [1, 0], [1, 2]])
v = torch.FloatTensor([3, 4, 5])
A = torch.sparse.FloatTensor(i.t(), v, torch.Size([2, 3]))
B = A.to_dense()
print(A)
print(B)
"""putput:
tensor(indices=tensor([[0, 1, 1],
[2, 0, 2]]),
values=tensor([3., 4., 5.]),
size=(2, 3), nnz=3, layout=torch.sparse_coo)
tensor([[0., 0., 3.],
[4., 0., 5.]])
"""
也可以构造混合稀疏张量, 其中只有前 n 个维度是稀疏的,其余维度是密集的。
import torch
i = torch.LongTensor([[2, 4]])
v = torch.FloatTensor([[1, 3], [5, 7]])
A = torch.sparse.FloatTensor(i, v)
B = A.to_dense()
print(A)
print(B)
"""output:
tensor(indices=tensor([[2, 4]]),
values=tensor([[1., 3.],
[5., 7.]]),
size=(5, 2), nnz=2, layout=torch.sparse_coo)
tensor([[0., 0.],
[0., 0.],
[1., 3.],
[0., 0.],
[5., 7.]])
"""
可以通过指定其大小来构造空的稀疏张量:
import torch
A = torch.sparse.FloatTensor(2, 3)
print(A)
"""output:
tensor(indices=tensor([], size=(2, 0)),
values=tensor([], size=(0,)),
size=(2, 3), nnz=0, layout=torch.sparse_coo)
"""