赞
踩
本章主要讲解了神经网络中的基础数据结构--张量Tensor,在MindSpore中的实现方式,主要包括构造、属性、运算和特殊张量--稀疏张量的表示。
主要包括了4种方式,直接创建、Numpy转张量、init初始化构造器和继承另一个张量。
- import numpy as np
- import mindspore
- from mindspore import ops
- from mindspore import Tensor, CSRTensor, COOTensor
-
- ## 根据数据直接创建张量
- data = [[1, 0], [1, 0]]
- x_data = Tensor(data)
- print(x_data, x_data.shape, x_data.dtype)
-
- ## NumPy数组转张量
- np_array = np.array(data)
- x_np = Tensor(np_array)
- print(x_np, x_np.shape, x_np.dtype)
-
- ## init初始化构造器创建张量
- from mindspore.common.initializer import One, Normal
-
- tensor1 = mindspore.Tensor(shape=(3, 2), dtype=mindspore.float32, init=One())
- tensor2 = mindspore.Tensor(shape=(4, 2), dtype=mindspore.float32, init=Normal())
- print("tensor1:\n", tensor1)
- print("tensor2:\n", tensor2)
-
- ## 继承另一个张量
- 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")
张量的属性包括形状、数据类型、转置张量、单个元素大小、占用字节数量、维数、元素个数和每一维步长。
- ## 张量的属性介绍
- x = Tensor(np.array([[1, 2, 1], [4, 5, 1], [3, 6, 1], [3, 6, 1]]), 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)
张量之间有很多运算,包括算术、线性代数、矩阵处理(转置、标引、切片)、采样等,张量运算和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 = Tensor(np.array([[0, 1], [2, 3]]).astype(np.float32))
-
- print("First row: {}".format(tensor[0]))
- print("value of bottom right corner: {}".format(tensor[1, 1]))
- print("Last column: {}".format(tensor[:, -1]))
- print("First column: {}".format(tensor[..., 0]))
- ## concat给定维度连接
- data1 = Tensor(np.array([[0, 1], [2, 3]]).astype(np.float32))
- data2 = Tensor(np.array([[4, 5], [6, 7]]).astype(np.float32))
- output = ops.concat((data1, data2), axis=1)
-
- print(output)
- print("shape:\n", output.shape)
- ## stack另一个维度连接
- data1 = Tensor(np.array([[0, 1], [2, 3]]).astype(np.float32))
- data2 = Tensor(np.array([[4, 5], [6, 7]]).astype(np.float32))
- output = ops.stack([data1, data2])
-
- print(output)
- print("shape:\n", output.shape)
- ## Tensor转换为NumPy
- t = Tensor([1., 1., 1., 1., 1.])
- print(f"t: {t}", type(t))
- n = t.asnumpy()
- print(f"n: {n}", type(n))
- ## NumPy转换为Tensor
- n = np.ones(5)
- t = Tensor.from_numpy(n)
- np.add(n, 1, out=n)
- print(f"n: {n}", type(n))
- print(f"t: {t}", type(t))
稀疏张量是一种特殊张量,其中绝大部分元素的值为零。
在某些应用场景中(比如推荐系统、分子动力学、图神经网络等),数据的特征是稀疏的,若使用普通张量表征这些数据会引入大量不必要的计算、存储和通讯开销。这时就可以使用稀疏张量来表征这些数据。
MindSpore现在已经支持最常用的CSR
和COO
两种稀疏数据格式。
常用稀疏张量的表达形式是<indices:Tensor, values:Tensor, shape:Tensor>
。其中,indices
表示非零下标元素, values
表示非零元素的值,shape表示的是被压缩的稀疏张量的形状。在这个结构下,我们定义了三种稀疏张量结构:CSRTensor
、COOTensor
和RowTensor
。
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的使用示例:
- ## 构建CSRTensor
- indptr = Tensor([0, 1, 2])
- indices = Tensor([0, 1])
- values = Tensor([1, 2], dtype=mindspore.float32)
- shape = (2, 4)
-
- csr_tensor = CSRTensor(indptr, indices, values, shape)
-
- print(csr_tensor.astype(mindspore.float64).dtype)
构造的效果如下:
COO
(Coordinate Format)稀疏张量格式用来表示某一张量在给定索引上非零元素的集合,若非零元素的个数为N
,被压缩的张量的维数为ndims
。各参数含义如下:
indices
: 二维整数张量,每行代表非零元素下标。形状:[N, ndims]
, 索引数据类型支持int16、int32、int64。
values
: 一维张量,表示相对应的非零元素的值。形状:[N]
。
shape
: 表示被压缩的稀疏张量的形状,目前仅支持二维COOTensor
。
COOTensor
的详细文档,请参考mindspore.COOTensor。
下面给出一些COOTensor的使用示例:
- 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)
构造的效果如下:
张量的实现方式与Pytorch稍有不同,需要在后续学习中熟悉MindSpore的特定写法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。