MindSpore张量相关操作
Tensor基本操作
导入相关库
import mindspore
import numpy as np
from mindspore import COOTensor, CSRTensor, Tensor, ops
创建张量
mindspore
支持使用Tensor
类从list
和numpy
创建张量,以及支持初始化0/1
矩阵和_like
创建方法。张量的创建方式有多种,构造张量时,支持传入Tensor
、float
、int
、bool
、tuple
、list
和numpy.ndarray
类型。
PS:因为能从numpy进行转换,所以numpy的初始化矩阵方法应该都能使用,先创建numpy再转换成Tensor即可
从List创建
data = [1, 0, 1, 0]
x_data = Tensor(data)
从numpy数组创建
NumPy转换为Tensor
data = [1, 0, 1, 0]
# 方法一
x_data = Tensor(data)
# 方法二
x_data = Tensor.from_numpy(data)
Tensor转换为NumPy,与张量创建相同,使用 Tensor.asnumpy()
Tensor变量转换为NumPy变量。
t = Tensor([1.0, 1.0, 1.0, 1.0, 1.0])
print(f"t: {t}", type(t))
n = t.asnumpy()
print(f"n: {n}", type(n))
使用构造器创建
当使用init
初始化器对张量进行初始化时,支持传入的参数有init
、shape
、dtype
。
init
: 支持传入initializer的子类。如:下方示例中的 One() 和 Normal()。shape
: 支持传入list
、tuple
、int
。dtype
: 支持传入mindspore.dtype。
from mindspore.common.initializer import Normal, One
# Initialize a tensor with ones
tensor1 = mindspore.Tensor(shape=(2, 2), dtype=mindspore.float32, init=One())
# Initialize a tensor from normal distribution
tensor2 = mindspore.Tensor(shape=(2, 2), dtype=mindspore.float32, init=Normal())
print("tensor1:\n", tensor1)
print("tensor2:\n", tensor2)
Tips:
init
主要用于并行模式下的延后初始化,在正常情况下不建议使用init对参数进行初始化。
创建继承张量属性的创张量
from mindspore import ops
x_ones = ops.ones_like(x_data)
print(f"Ones Tensor: \n {x_ones} \n")
x_zeros = ops.zeros_like(x_data)
print(f"Zeros Tensor: \n {x_zeros} \n")
张量基本属性
张量的属性
张量的属性包括形状、数据类型、转置张量、单个元素大小、占用字节数量、维数、元素个数和每一维步长。
-
形状(shape):
Tensor
的shape,是一个tuple。 -
数据类型(dtype):
Tensor
的dtype,是MindSpore的一个数据类型。 -
单个元素大小(itemsize):
Tensor
中每一个元素占用字节数,是一个整数。 -
占用字节数量(nbytes):
Tensor
占用的总字节数,是一个整数。 -
维数(ndim):
Tensor
的秩,也就是len(tensor.shape),是一个整数。 -
元素个数(size):
Tensor
中所有元素的个数,是一个整数。 -
每一维步长(strides):
Tensor
每一维所需要的字节数
,是一个tuple。(一个float32
数字对应4
个字节)
张量索引与运算
Tensor
索引与Numpy
索引类似,索引从0
开始编制,负索引表示按倒序编制,冒号:
和 ...
用于对数据进行切片。
张量之间有很多运算,包括算术、线性代数、矩阵处理(转置、标引、切片)、采样等,张量运算和NumPy
的使用方式类似
稀疏张量
稀疏张量的定义
稀疏张量是一种特殊张量,其中绝大部分元素的值为零。
在某些应用场景中(比如推荐系统、分子动力学、图神经网络等),数据的特征是稀疏的,若使用普通张量表征这些数据会引入大量不必要的计算、存储和通讯开销。这时就可以使用稀疏张量来表征这些数据。
MindSpore现在已经支持最常用的CSR
和COO
两种稀疏数据格式。
稀疏张量创建
CSRTensor
CSR
(Compressed Sparse Row)稀疏张量格式有着高效的存储与计算的优势。其中,非零元素的值存储在values
中,非零元素的位置存储在indptr
(行)和indices
(列)中。各参数含义如下:
-
indptr
: 一维整数张量, 表示稀疏数据每一行的非零元素在values
中的起始位置和终止位置, 索引数据类型支持int16、int32、int64。 -
indices
: 一维整数张量,表示稀疏张量非零元素在列中的位置, 与values
长度相等,索引数据类型支持int16、int32、int64。 -
values
: 一维张量,表示CSRTensor
相对应的非零元素的值,与indices
长度相等。 -
shape
: 表示被压缩的稀疏张量的形状,数据类型为Tuple
,目前仅支持二维CSRTensor
。
CSRTensor
的详细文档,请参考mindspore.CSRTensor。
下面给出一些CSRTensor
的使用示例:
# CSR映射格式
# 第一行: (1,x)->val; for x in indices[indptr[0]:indptr[1]]; for val in values[indptr[0]:indptr[1]]
# 第二行: (2,x)->val; for x in indices[indptr[1]:indptr[2]]; for val in values[indptr[1]:indptr[2]]
# ……
# 第n行: (n,x)->val; for x in indices[indptr[n]:indptr[n+1]]; for val in values[indptr[n]:indptr[n+1]]
indptr = Tensor([0, 1, 2]) # 设二维数组有n行,则indptr数组的长度为(n + 1)
indices = Tensor([0, 1])
values = Tensor([1, 2], dtype=mindspore.float32)
shape = (2, 4)
# Make a CSRTensor
csr_tensor = CSRTensor(indptr, indices, values, shape)
print(csr_tensor.astype(mindspore.float64).dtype)
上述代码会生成如下所示的CSRTensor
:
[ 1 0 0 0 0 2 0 0 ] \left[ \begin{matrix} 1 & 0 & 0 & 0 \\ 0 & 2 & 0 & 0 \end{matrix} \right] [10020000]
COOTensor
COO
(Coordinate Format)稀疏张量格式用来表示某一张量在给定索引上非零元素的集合,若非零元素的个数为N
,被压缩的张量的维数为ndims
。各参数含义如下:
-
indices
: 二维整数张量,每行代表非零元素下标。形状:[N, ndims]
, 索引数据类型支持int16、int32、int64。 -
values
: 一维张量,表示相对应的非零元素的值。形状:[N]
。 -
shape
: 表示被压缩的稀疏张量的形状,目前仅支持二维COOTensor
。
COOTensor
的详细文档,请参考mindspore.COOTensor。
下面给出一些COOTensor的使用示例:
# COO映射格式
# indices[i] -> values[i]
indices = Tensor([[0, 1], [1, 2]], dtype=mindspore.int32)
values = Tensor([1, 2], dtype=mindspore.float32)
shape = (3, 4)
# Make a COOTensor
coo_tensor = COOTensor(indices, values, shape)
print(coo_tensor.values)
print(coo_tensor.indices)
print(coo_tensor.shape)
print(coo_tensor.astype(mindspore.float64).dtype) # COOTensor to float64
上述代码会生成如下所示的COOTensor
:
[
0
1
0
0
0
0
2
0
0
0
0
0
]
\left[ \begin{matrix} 0 & 1 & 0 & 0 \\ 0 & 0 & 2 & 0 \\ 0 & 0 & 0 & 0 \end{matrix} \right]
000100020000