如何用其他 pytorch 函数替换 torch.sparse?

Posted

技术标签:

【中文标题】如何用其他 pytorch 函数替换 torch.sparse?【英文标题】:How to replace torch.sparse with other pytorch function? 【发布时间】:2021-08-09 17:02:09 【问题描述】:

我想用其他 Pytorch 函数替换 torch.sparse 函数。

i = torch.LongTensor([[0, 1, 1], [2, 0, 2]])
v = torch.FloatTensor([3, 4, 5])
out1 = torch.sparse.FloatTensor(i, v, torch.Size([2,3])).to_dense()
out2 = ???
out1 == out2
> tensor(True)

背景:

我正在将 Pytorch 模型转换为 CoreML,但在 torch.norm 函数中定义的 sparse_coo_tensor 运算符未使用 CoreMLTools 实现。

有些人遇到了这个问题,但 CoreMLTools 仍然不受支持。所以我想在没有torch.sparse.FloatTensor中使用的运算符的情况下替换它。

我试过torch.sparse_coo_tensor,但不支持。

我创建了一个简单的协作笔记本来重现这一点。请使用以下 colab 对其进行测试。 https://colab.research.google.com/drive/1TzpeJqEcmCy4IuXhhl6LChFocfZVaR1Q?usp=sharing

我之前在***上询问过不同的运算符,所以请参考。 How to replace torch.norm with other pytorch function?

【问题讨论】:

【参考方案1】:

如果我正确理解 sparse_coo 格式,i 的两行只是复制v 值的坐标。这意味着您可以改为创建矩阵,例如:

def dense_from_coo(i, v):
    rows = i[0].max()+1
    cols = i[1].max()+1
    out = torch.zeros(rows, cols)
    out[i[0], i[1]] = v
    return out

print(dense_from_coo(i,v))
>>> tensor([[0., 0., 3.],
            [4., 0., 5.]])

print(torch.sparse.FloatTensor(i, v, torch.Size([2,3])).to_dense())
>>> tensor([[0., 0., 3.],
            [4., 0., 5.]])

【讨论】:

以上是关于如何用其他 pytorch 函数替换 torch.sparse?的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch中的数学函数

pytorch如何导入ctc库

pytorch----nn.Modulenn.functionalnn.Sequentialnn.optim

使用 PyTorch 张量将对角线屏蔽为特定值

pytorch 常用函数参数详解

Pytorch 中 torch.cat() 函数解析