当前位置:   article > 正文

昇思25天学习打卡营第2天|张量 Tensor

昇思25天学习打卡营第2天|张量 Tensor

        本章主要讲解了神经网络中的基础数据结构--张量Tensor,在MindSpore中的实现方式,主要包括构造、属性、运算和特殊张量--稀疏张量的表示。

构造

        主要包括了4种方式,直接创建、Numpy转张量、init初始化构造器和继承另一个张量。

  1. import numpy as np
  2. import mindspore
  3. from mindspore import ops
  4. from mindspore import Tensor, CSRTensor, COOTensor
  5. ## 根据数据直接创建张量
  6. data = [[1, 0], [1, 0]]
  7. x_data = Tensor(data)
  8. print(x_data, x_data.shape, x_data.dtype)
  9. ## NumPy数组转张量
  10. np_array = np.array(data)
  11. x_np = Tensor(np_array)
  12. print(x_np, x_np.shape, x_np.dtype)
  13. ## init初始化构造器创建张量
  14. from mindspore.common.initializer import One, Normal
  15. tensor1 = mindspore.Tensor(shape=(3, 2), dtype=mindspore.float32, init=One())
  16. tensor2 = mindspore.Tensor(shape=(4, 2), dtype=mindspore.float32, init=Normal())
  17. print("tensor1:\n", tensor1)
  18. print("tensor2:\n", tensor2)
  19. ## 继承另一个张量
  20. from mindspore import ops
  21. x_ones = ops.ones_like(x_data)
  22. print(f"Ones Tensor: \n {x_ones} \n")
  23. x_zeros = ops.zeros_like(x_data)
  24. print(f"Zeros Tensor: \n {x_zeros} \n")

属性

        张量的属性包括形状、数据类型、转置张量、单个元素大小、占用字节数量、维数、元素个数和每一维步长。

  1. ## 张量的属性介绍
  2. x = Tensor(np.array([[1, 2, 1], [4, 5, 1], [3, 6, 1], [3, 6, 1]]), mindspore.int32)
  3. ## 形状
  4. print("x_shape:", x.shape)
  5. ## 基础数据类型
  6. print("x_dtype:", x.dtype)
  7. ## 基础数据类型的所占字节数
  8. print("x_itemsize:", x.itemsize)
  9. ## 总字节数
  10. print("x_nbytes:", x.nbytes)
  11. ## 秩
  12. print("x_ndim:", x.ndim)
  13. ## 元素个数
  14. print("x_size:", x.size)
  15. ## 每一维步长
  16. print("x_strides:", x.strides)

运算

        张量之间有很多运算,包括算术、线性代数、矩阵处理(转置、标引、切片)、采样等,张量运算和NumPy的使用方式类似,下面介绍其中几种操作。

  • 算数运算:加(+)、减(-)、乘(*)、除(/)、取模(%)、整除(//)。
  1. ## 张量运算
  2. x = Tensor(np.array([1, 2, 3]), mindspore.float32)
  3. y = Tensor(np.array([4, 5, 6]), mindspore.float32)
  4. output_add = x + y
  5. output_sub = x - y
  6. output_mul = x * y
  7. output_div = y / x
  8. output_mod = y % x
  9. output_floordiv = y // x
  10. print("add:", output_add)
  11. print("sub:", output_sub)
  12. print("mul:", output_mul)
  13. print("div:", output_div)
  14. print("mod:", output_mod)
  15. print("floordiv:", output_floordiv)

  • 索引:Tensor索引与Numpy索引类似,索引从0开始编制,负索引表示按倒序编制,冒号:和 ...用于对数据进行切片。
  1. ## 张量索引
  2. tensor = Tensor(np.array([[0, 1], [2, 3]]).astype(np.float32))
  3. print("First row: {}".format(tensor[0]))
  4. print("value of bottom right corner: {}".format(tensor[1, 1]))
  5. print("Last column: {}".format(tensor[:, -1]))
  6. print("First column: {}".format(tensor[..., 0]))

  • 拼接:concat和stack方法。
  1. ## concat给定维度连接
  2. data1 = Tensor(np.array([[0, 1], [2, 3]]).astype(np.float32))
  3. data2 = Tensor(np.array([[4, 5], [6, 7]]).astype(np.float32))
  4. output = ops.concat((data1, data2), axis=1)
  5. print(output)
  6. print("shape:\n", output.shape)

  1. ## stack另一个维度连接
  2. data1 = Tensor(np.array([[0, 1], [2, 3]]).astype(np.float32))
  3. data2 = Tensor(np.array([[4, 5], [6, 7]]).astype(np.float32))
  4. output = ops.stack([data1, data2])
  5. print(output)
  6. print("shape:\n", output.shape)

  • 数组转换:Tensor可以和NumPy进行互相转换。
  1. ## Tensor转换为NumPy
  2. t = Tensor([1., 1., 1., 1., 1.])
  3. print(f"t: {t}", type(t))
  4. n = t.asnumpy()
  5. print(f"n: {n}", type(n))

  1. ## NumPy转换为Tensor
  2. n = np.ones(5)
  3. t = Tensor.from_numpy(n)
  4. np.add(n, 1, out=n)
  5. print(f"n: {n}", type(n))
  6. print(f"t: {t}", type(t))

稀疏张量

稀疏张量是一种特殊张量,其中绝大部分元素的值为零。

在某些应用场景中(比如推荐系统、分子动力学、图神经网络等),数据的特征是稀疏的,若使用普通张量表征这些数据会引入大量不必要的计算、存储和通讯开销。这时就可以使用稀疏张量来表征这些数据。

MindSpore现在已经支持最常用的CSRCOO两种稀疏数据格式。

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

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的使用示例:

  1. ## 构建CSRTensor
  2. indptr = Tensor([0, 1, 2])
  3. indices = Tensor([0, 1])
  4. values = Tensor([1, 2], dtype=mindspore.float32)
  5. shape = (2, 4)
  6. csr_tensor = CSRTensor(indptr, indices, values, shape)
  7. print(csr_tensor.astype(mindspore.float64).dtype)

构造的效果如下:

COOTensor

COO(Coordinate Format)稀疏张量格式用来表示某一张量在给定索引上非零元素的集合,若非零元素的个数为N,被压缩的张量的维数为ndims。各参数含义如下:

  • indices: 二维整数张量,每行代表非零元素下标。形状:[N, ndims], 索引数据类型支持int16、int32、int64。

  • values: 一维张量,表示相对应的非零元素的值。形状:[N]

  • shape: 表示被压缩的稀疏张量的形状,目前仅支持二维COOTensor

COOTensor的详细文档,请参考mindspore.COOTensor

下面给出一些COOTensor的使用示例:

  1. indices = Tensor([[0, 1], [1, 2]], dtype=mindspore.int32)
  2. values = Tensor([1, 2], dtype=mindspore.float32)
  3. shape = (3, 4)
  4. # Make a COOTensor
  5. coo_tensor = COOTensor(indices, values, shape)
  6. print(coo_tensor.values)
  7. print(coo_tensor.indices)
  8. print(coo_tensor.shape)
  9. print(coo_tensor.astype(mindspore.float64).dtype)

构造的效果如下:

        张量的实现方式与Pytorch稍有不同,需要在后续学习中熟悉MindSpore的特定写法。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/784677
推荐阅读
  

闽ICP备14008679号