张量介绍

张量(Tensor)是MindSpore网络运算中的基本数据结构。

不同维度的张量分别表示不同的数据,0维张量表示标量,1维张量表示向量,2维张量表示矩阵,3维张量可以表示彩色图像的RGB三通道等等

张量构造

构造张量时,支持传入Tensor、float、int、bool、tuple、list和NumPy.array类型,其中tuple和list里只能存放float、int、bool类型数据。

Tensor初始化时,可指定dtype。如果没有指定dtype,初始值int、float、bool分别生成数据类型为mindspore.int32、mindspore.float64、mindspore.bool_的0维Tensor, 初始值tuple和list生成的1维Tensor数据类型与tuple和list里存放的数据类型相对应,如果包含多种不同类型的数据,则按照优先级:bool < int < float,选择相对优先级最高类型所对应的mindspore数据类型。 如果初始值是Tensor,则生成的Tensor数据类型与其一致;如果初始值是NumPy.array,则生成的Tensor数据类型与之对应。

张量的运算、属性和方法

运算

张量支持多种操作符运算,包括算术运算、逻辑运算等。以下是一些常用运算操作符:

算术运算:加(+)、减(-)、乘(*)、除(/)、取模(%)、幂次方(**)、整除(//)

逻辑运算:等于(==)、不等于(!=)、大于(>)、大于等于(>=)、小于(<)、小于等于(<=)

属性

张量的属性包括形状(shape)、数据类型(dtype)、转置张量(T)、单个元素大小(itemsize)、占用字节数量(nbytes)、维数(ndim)、元素个数(size)、每一维步长(strides)。

形状:Tensor的shape,是一个tuple。

数据类型:Tensor的dtype,是MindSpore的一个数据类型。

转置张量:Tensor的转置,也是一个Tensor。

单个元素大小: Tensor中每一个元素占用字节数,是一个整数。

占用字节数量: Tensor占用的总字节数,是一个整数。

维数: Tensor的秩,也就是len(tensor.shape),是一个整数。

元素个数: Tensor中所有元素的个数,是一个整数。

每一维步长: Tensor中每一维中进行遍历所需要经过的字节数。

方法

len():返回张量的长度。

str():返回张量的字符串表达。

repr():返回张量的字符串表达,供解释器读取。

hash():获取张量的哈希值。

all(axis, keep_dims):在指定维度上通过and操作进行归约,axis代表归约维度,keep_dims表示是否保留归约后的维度。

any(axis, keep_dims):在指定维度上通过or操作进行归约,参数含义同all。

asnumpy():将Tensor转换为NumPy的array。

sum(axis, dtype, keepdims, initial): 在指定维度上对张量进行归约求和,axis代表归约维度,dtype代表输出的数据的类型,keepdims表示是否保留归约后的维度, initial表示规约求和开始前的初始值。

稀疏张量

稀疏张量是一种特殊张量,其中绝大部分元素的值为零。在某些应用场景中(比如推荐系统),数据的特征是稀疏的,若使用普通张量表征这些数据会引入大量不必要的计算,存储和通讯开销。在这种时候就可以使用稀疏张量来表征这些数据。

常用稀疏张量的表达形式是<indices:Tensor, values:Tensor, dense_shape:Tensor>。其中,indices表示非零下标元素, values表示非零元素的值,dense_shape表示的是被压缩的稀疏张量的形状。 在这个结构下,我们定义了RowTensor和SparseTensor两种稀疏张量结构。

PyNative模式暂不支持稀疏张量。

RowTensor

RowTensor用于压缩第零个维度稀疏的张量。若RowTensor的维度为[L0, D1, D2, ..., DN ]。第零维度的非零元素个数为D0, 则有L0 >> D0。 - indices: 一维整数张量,表示稀疏张量第零维度中非零元素的位置。形状:[D0] - values: 表示相对应的非零元素的值。形状:[D0, D1, D2, ..., DN] - dense_shape: 表示的是被压缩的稀疏张量的形状。

SparseTensor

SparseTensor用于压缩非零元素位置分布不规则的Tensor,若非零元素的个数为N,被压缩的张量的维数为ndims,则有: - indices: 二维整数张量,每行代表非零元素下标。形状:[N, ndims] - values: 一维张量,表示相对应的非零元素的值。形状:[N] - dense_shape: 表示的是被压缩的稀疏张量的形状。

MindSpore NumPy函数

算子介绍

MindSpore Numpy具有四大功能模块:张量生成、张量操作、逻辑运算和其他常用数学运算。算子的具体相关信息可以参考NumPy接口列表。

张量生成

生成类算子用来生成和构建具有指定数值、类型和形状的数组(Tensor)。

张量操作

变换类算子主要进行数组的维度变换,分割和拼接等。

数组维度变换

矩阵转置,代码示例:

input_x = np.arange(10).reshape(5, 2)

output = np.transpose(input_x)

print(output)

交换指定轴,代码示例:

input_x = np.ones((1, 2, 3))

output = np.swapaxes(input_x, 0, 1)

print(output.shape)

数组分割

将输入数组平均切分为多个数组,代码示例:

input_x = np.arange(9)

output = np.split(input_x, 3)

print(output)

(Tensor(shape=[3], dtype=Int32, value= [0, 1, 2]), Tensor(shape=[3], dtype=Int32, value= [3, 4, 5]), Tensor(shape=[3], dtype=Int32, value= [6, 7, 8]))

数组拼接

将两个数组按照指定轴进行拼接,代码示例:

input_x = np.arange(0, 5)

input_y = np.arange(10, 15)

output = np.concatenate((input_x, input_y), axis=0)

print(output)

逻辑运算

逻辑计算类算子主要进行逻辑运算。

相等(equal)和小于(less)计算代码示例如下:

input_x = np.arange(0, 5)

input_y = np.arange(0, 10, 2)

output = np.equal(input_x, input_y)

print("output of equal:", output)

output = np.less(input_x, input_y)

print("output of less:", output)

output of equal: [ True False False False False]

output of less: [False True True True True]

数学运算

数学计算类算子主要进行各类数学计算: 加减乘除乘方,以及指数、对数等常见函数等。

数学计算支持类似NumPy的广播特性。

加法

以下代码实现了input_x和input_y两数组相加的操作:

input_x = np.full((3, 2), [1, 2])

input_y = np.full((3, 2), [3, 4])

output = np.add(input_x, input_y)

print(output)

矩阵乘法

以下代码实现了input_x和input_y两矩阵相乘的操作:

input_x = np.arange(2*3).reshape(2, 3).astype('float32')

input_y = np.arange(3*4).reshape(3, 4).astype('float32')

output = np.matmul(input_x, input_y)

print(output)

求平均值

以下代码实现了求input_x所有元素的平均值的操作:

input_x = np.arange(6).astype('float32')

output = np.mean(input_x)

print(output)

指数

以下代码实现了自然常数e的input_x次方的操作:

input_x = np.arange(5).astype('float32')

output = np.exp(input_x)

print(output)

MindSpore Numpy与MindSpore特性结合

mindspore.numpy能够充分利用MindSpore的强大功能,实现算子的自动微分,并使用图模式加速运算,帮助用户快速构建高效的模型。同时,MindSpore还支持多种后端设备,包括Ascend、GPU和CPU等,用户可以根据自己的需求灵活设置。以下提供了几种常用方法:

ms_function: 将代码包裹进图模式,用于提高代码运行效率。

GradOperation: 用于自动求导。

mindspore.context: 用于设置运行模式和后端设备等。

mindspore.nn.Cell: 用于建立深度学习模型。