张量是MindSpore网络运算中的基本数据结构
评:
在计算机基本知识里,有数据结构与算法。本质是用合适的计算机能表示和理解的方式(数据结构)描述事物,以更快、更省空间地进行计算(算法实现)。
在数据处理和信号处理、人工智能领域,向量化编程是一种思想,通过用数组、矩阵、张量进行数据表示,进而运算。因而线性代数起着一定作用,因为就是行向量、列向量、矩阵的各种运算和研究,而数组可以看成向量 ,张量本质即为AI编程框架的多维数组。
创建张量
张量的创建方式有多种,构造张量时,支持传入Tensor
、float
、int
、bool
、tuple
、list
和numpy.ndarray
类型。
-
根据数据直接生成
可以根据数据创建张量,数据类型可以设置或者通过框架自动推断。
-
data = [1, 0, 1, 0] x_data = Tensor(data) print(x_data, x_data.shape, x_data.dtype)
-
从NumPy数组生成
可以从NumPy数组创建张量。
-
np_array = np.array(data) x_np = Tensor(np_array) print(x_np, x_np.shape, x_np.dtype)
-
使用init初始化器构造张量
当使用
init
初始化器对张量进行初始化时,支持传入的参数有init
、shape
、dtype
。-
init
: 支持传入initializer的子类。如:下方示例中的 One() 和 Normal()。 -
shape
: 支持传入list
、tuple
、int
。 -
dtype
: 支持传入mindspore.dtype
from mindspore.common.initializer import One, Normal # 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)
-
- 继承另一个张量的属性,形成新的张量
张量的属性
从数据结构的角度理解,张量是一种结构体/类,因而有各种属性。
张量的属性包括形状、数据类型、转置张量、单个元素大小、占用字节数量、维数、元素个数和每一维步长。
-
形状(shape):
Tensor
的shape,是一个tuple。 -
数据类型(dtype):
Tensor
的dtype,是MindSpore的一个数据类型。 -
单个元素大小(itemsize):
Tensor
中每一个元素占用字节数,是一个整数。 -
占用字节数量(nbytes):
Tensor
占用的总字节数,是一个整数。 -
维数(ndim):
Tensor
的秩,也就是len(tensor.shape),是一个整数。 -
元素个数(size):
Tensor
中所有元素的个数,是一个整数。 -
每一维步长(strides):
Tensor
每一维所需要的字节数,是一个tuple。
x = Tensor(np.array([[1, 2], [3, 4]]), mindspore.int32)
print("x_shape:", x.shape)
print("x_dtype:", x.dtype)
print("x_itemsize:", x.itemsize)
print("x_nbytes:", x.nbytes)
print("x_ndim:", x.ndim)
print("x_size:", x.size)
print("x_strides:", x.strides)
知道有什么,调试的使用类似的用print
张量索引
Tensor索引与Numpy索引类似,索引从0开始编制,负索引表示按倒序编制,冒号:
和 ...
用于对数据进行切片。
张量运算
张量之间有很多运算,包括算术、线性代数、矩阵处理(转置、标引、切片)、采样等,张量运算和NumPy的使用方式类似,下面介绍其中几种操作。
普通算术运算有:加(+)、减(-)、乘(*)、除(/)、取模(%)、整除(//)。
x = Tensor(np.array([1, 2, 3]), mindspore.float32)
y = Tensor(np.array([4, 5, 6]), mindspore.float32)
output_add = x + y
output_sub = x - y
output_mul = x * y
output_div = y / x
output_mod = y % x
output_floordiv = y // x
print("add:", output_add)
print("sub:", output_sub)
print("mul:", output_mul)
print("div:", output_div)
print("mod:", output_mod)
print("floordiv:", output_floordiv)
Tensor与NumPy转换
Tensor可以和NumPy进行互相转换。
Tensor转换为NumPy
与张量创建相同,使用 Tensor.asnumpy() 将Tensor变量转换为NumPy变量。
NumPy转换为Tensor
使用Tensor()
将NumPy变量转换为Tensor变量。
稀疏张量
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的使用示例:
COOTensor
COO
(Coordinate Format)稀疏张量格式用来表示某一张量在给定索引上非零元素的集合,若非零元素的个数为N
,被压缩的张量的维数为ndims
。各参数含义如下:
-
indices
: 二维整数张量,每行代表非零元素下标。形状:[N, ndims]
, 索引数据类型支持int16、int32、int64。 -
values
: 一维张量,表示相对应的非零元素的值。形状:[N]
。 -
shape
: 表示被压缩的稀疏张量的形状,目前仅支持二维COOTensor
。
COOTensor
的详细文档,请参考mindspore.COOTensor。
下面给出一些COOTensor的使用示例:
下一篇,开始简化些(偷懒),把核心心得和流程写上,代码细节与接口等等外引连接之类的。