MindSpore之张量(Tensor)分析
对于初学深度学习的人(就比如我)一定会对张量(Tensor)感到疑惑,因为自己经常见到它但就是不知道它的具体含义。在这篇文章我们就来看一下MindSpore中的Tensor,在此之前我们先来了解一下张量是什么。
从神经网络来看,神经网络中的输入、输出和变换都是用张量表示的(张量是神经网络使用的主要数据结构)。从数学具体实例来看,张量可以是一个多维数组,就像这样:
- 标量是0维张量
- 向量是一维张量(一维数组)
- 矩阵是二维张量 (二维数组)
- n维数组是n维张量
Tensor也可以被看成一种数据结构,该结构简洁而强大,非常适合进行矩阵类的数值计算。在MindSpore中Tensor是其网络运算中的基本数据结构,通常不同维度的张量表示不同的数据,前面已经说了标量是0维张量,矩阵是二维张量,而三维张量可以表示彩色图像的RGB三通道。而处理三维张量的图片数字集(MNIST),用来训练手写数字识别的模型可以说是深度学习里面的Hello world。接下来我们就来看正文吧。
Tensor的构造
首先导入需要的相应的模块和对外接口api:
import numpy as np #导入科学计算模块numpy
from mindspore import Tensor, context #导入Tensor模块与配置环境的context模块
from mindspore import dtype as mstype #导入dtype模块,该模块包含了相应的数据转化
context.set_context(mode=context.GRAPH_MODE, device_target="CPU")
#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的解读,下面我们通过有关代码看一下具体的构造:
x = Tensor(np.array([[1, 2], [3, 4]]), mstype.int32)
y = Tensor(1.0, mstype.int32)
z = Tensor(2, mstype.int32)
m = Tensor(True, mstype.bool_)
n = Tensor((1, 2, 3), mstype.int16)
p = Tensor([4.0, 5.0, 6.0], mstype.float64)
q = Tensor(p, mstype.float64)
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的运算包括算数运算(即加,减,乘等等)与逻辑运算(>,<,>=,<=等等),我们在神经网络的构建计算过程中往往会牵扯到高阶矩阵即多维张量,在这个过程中我们用到的多的运算基本上是加,减,乘,幂次等,除法,取余等比较少用。
由于加法,减法和正常的加减区别不大,就是对应元素的相加减,所以这里我们只展示一下张量的乘法:
代码:
x=Tensor(np.array([[1,2],[3,4]]),mstype.int32)
y=Tensor(np.array([[5,6],[7,8]]),mstype.int32)
output_mul=x*y
print(output_mul)
运行结果:
[[ 5 12]
[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观看相关文档,我也在上面借鉴了很多内容。上面还有一些张量的方法,以及一些特殊张量的表示等。 由于本人知识有限,若有错误,还请多多包涵与指教!
- 点赞
- 收藏
- 关注作者
评论(0)