torch.sparse.mm
- torch.sparse.mm()
-
执行稀疏矩阵
mat1
和(稀疏或步进)矩阵mat2
之间的矩阵乘法。类似于torch.mm()
,如果mat1
是一个$(n \times m)$张量,而mat2
是一个$(m \times p)$张量,则输出out将是一个$(n \times p)$张量。当mat1
是COO张量时,它必须具有sparse_dim = 2属性。如果输入为COO张量,则此函数还支持对两个输入的反向传播。支持_CSR_和_COO_存储格式。
注意
此函数不支持计算与CSR矩阵相关的导数。
此函数还接受一个可选的
reduce
参数,用于指定可选的缩减操作,其数学运算如下:$z_{ij} = \bigoplus_{k = 0}^{K - 1} x_{ik} y_{kj}$其中$\bigoplus$表示减少操作符。函数
reduce
仅在CPU设备上的CSR存储格式中被实现。- 参数
- 形状:
-
该函数输出张量的格式如下:稀疏矩阵乘以稀疏矩阵得到稀疏结果,稀疏矩阵乘以密集矩阵得到密集结果。
示例:
>>> a = torch.tensor([[1., 0, 2], [0, 3, 0]]).to_sparse().requires_grad_() >>> a tensor(indices=tensor([[0, 0, 1], [0, 2, 1]]), values=tensor([1., 2., 3.]), size=(2, 3), nnz=3, layout=torch.sparse_coo, requires_grad=True) >>> b = torch.tensor([[0, 1.], [2, 0], [0, 0]], requires_grad=True) >>> b tensor([[0., 1.], [2., 0.], [0., 0.]], requires_grad=True) >>> y = torch.sparse.mm(a, b) >>> y tensor([[0., 1.], [6., 0.]], grad_fn=<SparseAddmmBackward0>) >>> y.sum().backward() >>> a.grad tensor(indices=tensor([[0, 0, 1], [0, 2, 1]]), values=tensor([1., 0., 2.]), size=(2, 3), nnz=3, layout=torch.sparse_coo) >>> c = a.detach().to_sparse_csr() >>> c tensor(crow_indices=tensor([0, 2, 3]), col_indices=tensor([0, 2, 1]), values=tensor([1., 2., 3.]), size=(2, 3), nnz=3, layout=torch.sparse_csr) >>> y1 = torch.sparse.mm(c, b, 'sum') >>> y1 tensor([[0., 1.], [6., 0.]], grad_fn=<SparseMmReduceImplBackward0>) >>> y2 = torch.sparse.mm(c, b, 'max') >>> y2 tensor([[0., 1.], [6., 0.]], grad_fn=<SparseMmReduceImplBackward0>)