MindSpore之张量(Tensor)分析

举报
钟文 发表于 2021/10/31 16:35:40 2021/10/31
【摘要】 对于初学深度学习的人(就比如我)一定会对张量(Tensor)感到疑惑,因为自己经常见到它但就是不知道它的具体含义。在这篇文章我们就来看一下MindSpore中的Tensor,在此之前我们先来了解一下张量是什么。从神经网络来看,神经网络中的输入、输出和变换都是用张量表示的(张量是神经网络使用的主要数据结构)。从数学具体实例来看,张量可以是一个多维数组,就像这样:标量是0维张量向量是一维张量(一...

对于初学深度学习的人(就比如我)一定会对张量(Tensor)感到疑惑,因为自己经常见到它但就是不知道它的具体含义。在这篇文章我们就来看一下MindSpore中的Tensor,在此之前我们先来了解一下张量是什么。

从神经网络来看,神经网络中的输入、输出和变换都是用张量表示的(张量是神经网络使用的主要数据结构)。从数学具体实例来看,张量可以是一个多维数组,就像这样:

  • 标量是0维张量
  • 向量是一维张量(一维数组)
  • 矩阵是二维张量 (二维数组)
  • n维数组是n维张量

Tensor也可以被看成一种数据结构,该结构简洁而强大,非常适合进行矩阵类的数值计算。在MindSpore中Tensor是其网络运算中的基本数据结构,通常不同维度的张量表示不同的数据,前面已经说了标量是0维张量,矩阵是二维张量,而三维张量可以表示彩色图像的RGB三通道。而处理三维张量的图片数字集(MNIST),用来训练手写数字识别的模型可以说是深度学习里面的Hello world。接下来我们就来看正文吧。

Tensor的构造

首先导入需要的相应的模块和对外接口api:

  1. import numpy as np #导入科学计算模块numpy
  2. from mindspore import Tensor, context #导入Tensor模块与配置环境的context模块
  3. from mindspore import dtype as mstype #导入dtype模块,该模块包含了相应的数据转化
  4. context.set_context(mode=context.GRAPH_MODE, device_target="CPU")
  5. #mode为样例运行使用的模式,这里选用的是图模式,device_target为选择实际的配置硬件信息,可以选择CPU,GPU,也可以选择华为自研的Ascend AI处理器上(Ascend)

构造的基本形式是:

tensor=Tensor(data,dtype)

参数data是指传入要将它构造成张量的数据类型,可以传入Tensor,int,float,bool,Numpy.array等,dtype是指构造的张量的数据类型,初始化时可以指定dtype也可以不指定dtype,在不指定的情况下,初始值的数据类型将默认转化为mindspore.dtype中的相关类型,即初始值int,float,bool分别生成mindspore.int32,mindspore.float64,mindspore.bool_的0维Tensor,其它的初始值也有类似的转化方法,具体有关mindspore.dtype的详情可看阳斯杰同学对于dtype的解读,下面我们通过有关代码看一下具体的构造:

  1. x = Tensor(np.array([[1, 2], [3, 4]]), mstype.int32)
  2. y = Tensor(1.0, mstype.int32)
  3. z = Tensor(2, mstype.int32)
  4. m = Tensor(True, mstype.bool_)
  5. n = Tensor((1, 2, 3), mstype.int16)
  6. p = Tensor([4.0, 5.0, 6.0], mstype.float64)
  7. q = Tensor(p, mstype.float64)
  8. print(x, "\n\n", y, "\n\n", z, "\n\n", m, "\n\n", n, "\n\n", p, "\n\n", q)

运行截图如下:

可以看到在上面的构造中,我们都指定了dtype的具体类型,因为这样可以加强我们对数据类型的概念,在熟练掌握之后我们就可以使用默认的。其中张量y是将1.0(float)转化为int32(1),张量q中传入的初始值p是也是一个张量,然后再给这个张量指定数据类型为float64。

Tensor的运算

Tensor的运算包括算数运算(即加,减,乘等等)与逻辑运算(>,<,>=,<=等等),我们在神经网络的构建计算过程中往往会牵扯到高阶矩阵即多维张量,在这个过程中我们用到的多的运算基本上是加,减,乘,幂次等,除法,取余等比较少用。

由于加法,减法和正常的加减区别不大,就是对应元素的相加减,所以这里我们只展示一下张量的乘法:

代码:

  1. x=Tensor(np.array([[1,2],[3,4]]),mstype.int32)
  2. y=Tensor(np.array([[5,6],[7,8]]),mstype.int32)
  3. output_mul=x*y
  4. print(output_mul)

运行结果:

  1. [[ 5 12]
  2. [21 32]]

其实这里就是两个2x2矩阵的相乘,但我们需要注意的是在神经网络的运算中往往会有很多层矩阵的嵌套乘法,在这个过程中我们就需要注意到两个相乘张量之间的维度关系,(axb和bxc的张量才能相乘),带入上面样例中的话a=b=c=2。所以为了所写程序的正确性,我们来看一下张量的属性。

Tensor的属性

在上文中其实我已经讲到了张量的两个属性:形状(shape)(x.shape,返回一个元组tuple),数据类型(dtype)(x.dtype)。张量也还有一些其它的比较重要的属性,如:

  • 转置张量:Tensor的转置,也是一个Tensor。 (x.T)
  • 单个元素大小: Tensor中每一个元素占用字节数,是一个整数。 (x.itemsize)
  • 占用字节数量: Tensor占用的总字节数,是一个整数。 (x.nbytes)
  • 维数: Tensor的秩,也就是len(tensor.shape),是一个整数。 (x.ndim)
  • 元素个数: Tensor中所有元素的个数,是一个整数。 (x.size)
  • 每一维步长: Tensor中每一维中进行遍历所需要经过的字节数。 (x.strides)

转置张量可以理解为线性代数里面的转置矩阵,单个元素的大小即dtype所占的字节数,用一个二维的数组来理解维数(数组的行数)。这里我尝试了几个我认为几个比较常见的属性:

大家可以自己定义一个张量,然后去打印出它的各个属性,以便自己更加深刻直观的理解。 本篇文章到这里就差不多结束了,但MindSpore中张量的知识还有很多,远不止于此,大家可前往官方http://mindspore.cn观看相关文档,我也在上面借鉴了很多内容。上面还有一些张量的方法,以及一些特殊张量的表示等。 由于本人知识有限,若有错误,还请多多包涵与指教!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。