pytorch - 如何初始化混合稀疏张量中的列
问题描述
如何在 pytorch 混合张量中初始化torch.sparse_coo_tensor
(一个维度是稀疏的,另一个不是),它具有以下密集表示?
array([[1, 0, 5, 0],
[2, 0, 6, 0],
[3, 0, 7, 0],
[4, 0, 8, 0]])
我应该在indices
论证中加入什么?
解决方案
如何初始化
像这样的东西:
import torch
indices = torch.tensor([[0, 0, 1, 1, 2, 2, 3, 3], [0, 2, 0, 2, 0, 2, 0, 2]])
tensor = torch.sparse_coo_tensor(
indices, torch.tensor([1, 2, 3, 4, 5, 6, 7, 8]), size=(4, 4)
)
上面给出:
indices
- 第一个维度指定非零值所在的行、第二列。这些变成对,在这种情况下:(0, 0)
,(0, 2)
,(1, 0)
,(1, 2)
... 等等values
- 位于这些对的值,因此1
将在(0, 0)
坐标2
下,在下(0, 2)
等等。size
- 在这种情况下,可以从您的输入中推断出矩阵的总大小,可选
8 对,8 个值,还有其他方法来指定它,但这个想法是成立的。
快速检查:
print(tensor)
print(tensor.to_dense())
给我们:
tensor(indices=tensor([[0, 0, 1, 1, 2, 2, 3, 3],
[0, 2, 0, 2, 0, 2, 0, 2]]),
values=tensor([1, 2, 3, 4, 5, 6, 7, 8]),
size=(4, 4), nnz=8, layout=torch.sparse_coo)
tensor([[1, 0, 2, 0],
[3, 0, 4, 0],
[5, 0, 6, 0],
[7, 0, 8, 0]])
为什么要初始化
如果您的实际数据50%
稀疏,则不应使用 COO 张量。它会节省一些内存,但操作会慢很多,所以请记住这一点。