参考来源:
    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) 处, 然后我们可以这样写:

    1. import torch
    2. i = torch.LongTensor([[0, 1, 1],
    3. [2, 0, 2]])
    4. v = torch.FloatTensor([3, 4, 5])
    5. A = torch.sparse.FloatTensor(i, v, torch.Size([2, 3]))
    6. B = A.to_dense()
    7. print(A)
    8. print(B)
    9. """output:
    10. tensor(indices=tensor([[0, 1, 1],
    11. [2, 0, 2]]),
    12. values=tensor([3., 4., 5.]),
    13. size=(2, 3), nnz=3, layout=torch.sparse_coo)
    14. tensor([[0., 0., 3.],
    15. [4., 0., 5.]])
    16. """

    注意,LongTensor 的输入不是索引元组的列表. 如果你想这样写你的指标, 你应该在把它们传递给稀疏构造函数之前进行转置:

    1. import torch
    2. i = torch.LongTensor([[0, 2], [1, 0], [1, 2]])
    3. v = torch.FloatTensor([3, 4, 5])
    4. A = torch.sparse.FloatTensor(i.t(), v, torch.Size([2, 3]))
    5. B = A.to_dense()
    6. print(A)
    7. print(B)
    8. """putput:
    9. tensor(indices=tensor([[0, 1, 1],
    10. [2, 0, 2]]),
    11. values=tensor([3., 4., 5.]),
    12. size=(2, 3), nnz=3, layout=torch.sparse_coo)
    13. tensor([[0., 0., 3.],
    14. [4., 0., 5.]])
    15. """

    也可以构造混合稀疏张量, 其中只有前 n 个维度是稀疏的,其余维度是密集的。

    1. import torch
    2. i = torch.LongTensor([[2, 4]])
    3. v = torch.FloatTensor([[1, 3], [5, 7]])
    4. A = torch.sparse.FloatTensor(i, v)
    5. B = A.to_dense()
    6. print(A)
    7. print(B)
    8. """output:
    9. tensor(indices=tensor([[2, 4]]),
    10. values=tensor([[1., 3.],
    11. [5., 7.]]),
    12. size=(5, 2), nnz=2, layout=torch.sparse_coo)
    13. tensor([[0., 0.],
    14. [0., 0.],
    15. [1., 3.],
    16. [0., 0.],
    17. [5., 7.]])
    18. """

    可以通过指定其大小来构造空的稀疏张量:

    1. import torch
    2. A = torch.sparse.FloatTensor(2, 3)
    3. print(A)
    4. """output:
    5. tensor(indices=tensor([], size=(2, 0)),
    6. values=tensor([], size=(0,)),
    7. size=(2, 3), nnz=0, layout=torch.sparse_coo)
    8. """