Pytorch中Tensor的属性及稀疏张量

介绍Pytorch中Tensor的属性以及稀疏张量的概念,还有一个小概念——COO风格矩阵。

Tensor的属性

每个Tensor有三个属性

  • torch.dtype:表示Tensor的类型
  • torch.device:表示Tensor对象在创建后所存储在的设备名称
  • torch.layout:表示Tensor对象的内存布局(稠密或稀疏)
1
2
3
4
# dev = torch.device("cpu")
dev = torch.device("cuda")
# 通过参数指定Tensor的类型和设备
a = torch.tensor([2, 2], dtype=torch.float32, device=dev)

第一个参数为Tensor的元素值

1
tensor([2., 2.], device='cuda:0')

稀疏张量

定义稀疏张量需要三个参数

  • 非零元素的坐标
  • 非零元素的值
  • Tensor的形状

其中,非零元素的坐标和值需要定义为Tensor

1
2
3
4
# i为非零元素的坐标
i = torch.tensor([[0, 1, 2, 3], [0, 1, 2, 3]])
# v为非零元素的值
v = torch.tensor([1, 2, 3, 4])

利用sparse_coo_tensor()函数定义稀疏张量

1
a = torch.sparse_coo_tensor(i, v, (4, 4))

最后一个参数为Tensor的形状

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

可以转换为稠密张量

1
a = a.to_dense()
1
2
3
4
tensor([[1, 0, 0, 0],
[0, 2, 0, 0],
[0, 0, 3, 0],
[0, 0, 0, 4]])

注意非零元素的坐标和值的定义,采用的是COO风格矩阵的表示方法

COO风格矩阵采用三元组表示元素的位置和值,即(row, col, value)

sparse_coo_tensor()函数中

  • indices表示非零元素的位置,该参数定义为了含有两个向量的Tensor,第一个向量表示行,第二个向量表示列
  • values表示非零元素的值,该参数定义为了含有一个向量的Tensor,向量的值即为非零元素的值

两个参数共同组成了三元组,即COO风格矩阵

当然也可以同时指定Tensor的属性

1
a = torch.sparse_coo_tensor(i, v, (4, 4), dtype=torch.float32, device=dev).to_dense()
1
2
3
4
tensor([[1., 0., 0., 0.],
[0., 2., 0., 0.],
[0., 0., 3., 0.],
[0., 0., 0., 4.]], device='cuda:0')

Pytorch中Tensor的属性及稀疏张量

https://deleter-d.github.io/posts/42093/

作者

亦初

发布于

2022-09-16

更新于

2024-06-19

许可协议

评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...