MindSpore COOTensor 学习

2 阅读1分钟

​COOTensor 是 MindSpore 中用于表示稀疏张量的一种核心数据结构。它采用“坐标格式”(COO, Coordinate Format)来高效存储和处理主要包含零元素的矩阵(或高维张量),其核心思想是只记录非零元素的位置和值。

一、 核心概念与创建

一个 COOTensor 由三个关键部分构成:

  1. **indices(索引)**:一个二维整数张量,形状为 (N, ndims)。其中 N代表非零元素的个数,ndims代表稀疏张量的维度。目前文档指出 ndims仅支持为 2。indices[i]表示第 i个非零元素的坐标。
  2. **values(值)**:一个一维张量,形状为 (N,),存储了 indices中每个位置对应的非零数值。
  3. **shape(形状)**:一个整数元组,指定了对应的稠密张量的形状。

创建方式主要通过 mindspore.COOTensor构造函数:

  • 方式一:直接提供 indices, values, shape三个参数。
  • 方式二:通过另一个 coo_tensor对象来初始化。

示例:以下代码创建了一个 3x4 的稠密张量对应的 COOTensor,其中位置 (0,1) 值为1,位置 (1,2) 值为2。

import mindspore as ms
from mindspore import Tensor, COOTensor
indices = Tensor([[0, 1], [1, 2]], dtype=ms.int32)
values = Tensor([1, 2], dtype=ms.float32)
shape = (3, 4)
x = COOTensor(indices, values, shape)

其对应的稠密张量为:

[[0, 1, 0, 0],
 [0, 0, 2, 0],
 [0, 0, 0, 0]]

二、 主要属性与方法

COOTensor 提供了一系列用于查询、转换和运算的属性和方法。

1. 关键属性:

  • indices, values, shape:获取构成该稀疏张量的三个核心组件。
  • dtype:返回非零元素值的数据类型。
  • ndim:返回稀疏矩阵的稠密维度(即 shape的长度)。
  • size:返回非零元素的数量(即 values的长度)。
  • itemsize:返回每个非零元素值所占的字节数。

2. 格式转换方法:

  • to_dense():将 COOTensor 转换为普通的稠密 Tensor(仅在 GPU 平台支持)。
  • to_csr():将 COOTensor 转换为另一种稀疏格式 CSRTensor(支持 GPU/CPU)。
  • to_tuple():将 indices, values, shape作为一个元组返回。
  • astype(dtype):返回指定新数据类型的 COOTensor。

3. 运算与处理:

  • 算术运算:支持基本的加(+)、减(-)、乘(*)、除(/)等逐元素运算。
  • abs():对所有非零元素取绝对值,返回新的 COOTensor。
  • add(other, thresh):与另一个 COOTensor 相加。thresh参数是一个阈值张量,用于决定结果中 indices/values 对是否保留(当结果值小于阈值时被丢弃)。此方法对 indicesvalues的数据类型有严格校验。
  • coalesce():合并 COOTensor 中相同索引的值(仅在 GPU 平台支持)。这是处理可能包含重复索引的 COOTensor 的重要操作。