首页 > 解决方案 > 如何初始化混合稀疏张量中的列

问题描述

如何在 pytorch 混合张量中初始化torch.sparse_coo_tensor(一个维度是稀疏的,另一个不是),它具有以下密集表示?

array([[1, 0, 5, 0],
       [2, 0, 6, 0],
       [3, 0, 7, 0],
       [4, 0, 8, 0]])

我应该在indices论证中加入什么?

标签: pytorchsparse-matrix

解决方案


如何初始化

像这样的东西:

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 张量。它会节省一些内存,但操作会慢很多,所以请记住这一点。


推荐阅读