Paddle 稀疏计算 使用指南
1. 稀疏格式介绍
1.1 稀疏格式介绍
稀疏矩阵是一种特殊的矩阵,其中绝大多数元素为0。与密集矩阵相比,稀疏矩阵可以节省大量存储空间,并提高计算效率。
例如,一个5x5的矩阵中只有3个非零元素:
import paddle
dense_tensor = paddle.to_tensor([[0, 0, 0, 0, 6],
[0, 0, 0, 2, 0],
[0, 0, 0, 0, 0],
[0, 8, 0, 0, 0],
[0, 0, 0, 0, 0]], stop_gradient=False)
由于稀疏矩阵中大多数元素为0, 因此我们无需为这些 0 元素单独分配存储空间, 可以只存储非零元素的值和索引信息, 从而节省存储空间。
1.2 稀疏矩阵的存储格式
1.2.1 COO 格式
COO(Coordinate) 格式是最直接的稀疏存储方式,它将非零元素的值和对应的行列索引分别存储在两个向量中。
import paddle
from paddle.sparse import sparse_coo_tensor
# 构建稀疏 COO 张量
indices = [[0, 1, 2], [1, 2, 0]]
values = [1.0, 2.0, 3.0]
dense_shape = [3, 3]
coo = sparse_coo_tensor(indices, values, dense_shape)
print(coo)
# Tensor(shape=[3, 3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True,
# indices=[[0, 1, 2],
# [1, 2, 0]],
# values=[1., 2., 3.])
上面代码中, indices
存储了非零元素的行列索引, values
存储了非零元素的值, dense_shape
存储了稀疏张量的形状。 实际上它存储的数据是:
[[0, 1, 0],
[0, 0, 2],
[3, 0, 0]]
下图更好的展示了 COO 格式的稀疏矩阵:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
1.2.2 CSR 格式
CSR(Compressed Sparse Row) 格式按行存储压缩矩阵的非零元素。每一行中的非零元素用连续的储存空间存储, 从而可以高效地访问矩阵中同一行的数据。
下面是一个 CSR 格式的稀疏矩阵示例:
import paddle
from paddle.sparse import sparse_csr_tensor
# 构建稀疏 CSR 张量
crows = [0, 2, 3, 5]
cols = [1, 3, 2, 0, 1]
values = [1,