Tensor(张量)是MindSpore框架中最基础且核心的数据结构,用于存储和操作多维数组(n-dimensional array),是整个计算图的数据载体。理解其特性和用法是使用MindSpore进行深度学习开发的第一步。
一、Tensor的创建与初始化
创建Tensor的方式灵活多样,主要依赖于mindspore.Tensor构造函数。关键参数包括:
- **
input_data**:支持从多种数据源直接创建,如Python标量(int, float)、列表/元组、NumPy的ndarray对象,或是另一个已有的Tensor。这是最常用的初始化方式。 - **
dtype**:指定张量的数据类型(如ms.float32)。若不提供,则自动推断为input_data的数据类型。 - **
shape**:定义张量的形状。通常与input_data配合使用,或与init参数一起用于定义动态形状或进行延迟初始化。 - **
init**:配合shape和dtype使用,用于并行模式下的延迟初始化。通过Initializer(如One())指定初始化方式,随后需调用init_data()方法实际加载数据。
二、Tensor的主要特性与操作方法
可归纳为以下几大类操作:
- 数学运算:包括逐元素运算(
add,mul,div)、三角函数(sin,cos)、指数对数(exp,log)、取整(floor,ceil)等,多数有对应的mindspore.ops接口。 - 线性代数运算:如矩阵乘法(
matmul,mm)、转置(T)、逆(inverse)、范数(norm)等。 - 形状操作与索引:这是调整数据维度的关键,包括重塑形状(
reshape)、转置维度(transpose)、扩展/压缩维度(expand_dims,squeeze)、切片、以及各种gather和scatter操作。 - 归约统计操作:用于计算张量在某一维度或全局的统计值,如求和(
sum)、求均值(mean)、最大值/最小值(max/min)及其索引(argmax/argmin)。 - 数据类型与设备转换:
astype()方法是推荐的类型转换方式。to()方法可以将Tensor移动到目标设备(如GPU)并转换数据类型。 - 与其他格式的转换:
asnumpy()(或别名numpy())可将Tensor转换为NumPy数组,便于与Python生态交互。from_numpy()则实现反向转换。
三、重要说明与注意事项
- in-place操作限制:在CPU、GPU的所有模式及图模式(
GRAPH_MODE)下,MindSpore不支持原地操作。虽然文档中部分方法有_后缀(如add_)的“in-place版本”描述,但在这些执行环境下可能实际并非真正地原地修改,需结合具体版本和上下文确认。 - 初始化
init参数:当使用init参数进行延迟初始化时,必须后续显式调用tensor.init_data()来加载数据,Tensor才能被使用。 - 动态形状:通过在
shape参数中指定None或Symbol类型,可以创建动态形状的Tensor,这为定义灵活的计算图提供了支持。 - 转换推荐:进行数据类型转换时,官方推荐使用
tensor.astype(dtype)方法,而非通过构造函数Tensor(sourceTensor, dtype=newDtype)的方式。