MindSpore之算子(1)
今天我们来看一下MindSpore中算子的使用。第一步肯定是对算子有个大体得了解。算子是什么?它有什么作用。
广义的讲,对于任何函数进行某一项操作都可以认为是一个算子,甚至包括求幂次,开根号都可以认为是一个算子,只是有的算子我们用了一个符号来代替他所要进行的运算罢了(数学上的习惯),所以大家看到算子就不要觉得它很高大上,它其实和加减乘除这些基本的运算区别不大,只是它的计算可能更加的复杂(它可能是非线性的计算)。总之呢算子可以狭义地理解为是一个函数,使用它可以计算某些数据。
接下来看它的作用,在深度学习中,我们经常要进行梯度下降,要确定网络模型,要训练参数,在这些过程中会涉及到各种复杂的计算,那么自然是需要各种各样合适的算子去发挥作用的。就目前我这种刚接触深度学习的小白来说,最常见到的算子就是神经网络层之间的激活函数,有 ReLU,Sigmoid,Tanh等等。
那接下来我们就进入正文吧。
MindSpore中主要的算子接口是由mindspore.ops模块提供的(主要是一些数学数据计算方面的算子,用于神经单元的构造函数),另外mindspore.nn模块中也提供了一系列的算子接口,主要是用于构建神经网络的预定义构建块或计算单元。
mindspore.ops.operations
operations提供了所有的Primitive算子接口,它直接封装了底层的Ascend、GPU、CPU等多种算子的具体实现,为用户提供基础算子能力。
使用Sigmoid算子(激活函数)的样例代码如下:
import numpy as np
import mindspore
from mindspore import Tensor
from mindspore import dtype as mstype
import mindspore.ops.operations as P
x = Tensor(np.array([0.0 , 1.0, 2.0]),mstype.float32)
Sigmoid = P.Sigmoid()
output = Sigmoid(x)
print("output =", output)
运行截图:
Sigmoid函数原型为:
其图像为:
因此,我们输入一个x张量,使用Sigmoid激活函数对它的数据进行处理会得到运行截图中的结果。
MindSpore作为一款深度学习框架,它为开发者们封装好了一系列常用的好用的算子,并且有的算子在框架中得到了优化,使得它的计算速率更快。这使得开发者们训练模型变得更加简单,且降低开发者的训练时间。想要了解更多ops模块中的算子支持情况可查看算子支持列表。
mindspore.ops.functional
functional板块呢就是一些函数运算符,与operations中的算子在使用上不一样(api接口),我们可以直接将它用作函数(与它的取名一样),它主要是为了简化没有属性的算子的调用流程,当然MindSpore也只提供了部分算子的functional版本,因为它的功能实际上与operations差不多。所以我在这里就不举其中某些算子的例子了,大家可前往算子列表查看。
mindspore.ops.composite
composite指的是其中含有一些算子的组合,包括core,dot等一些相关的算子,以及设计计算图中的梯度下降的函数等。
算子的组合可以直接像函数一样,传入参数直接调用。这里我用matmul实现返回两个数组的矩阵乘积举例。
代码如下:
from mindspore import dtype as mstype
from mindspore.ops import composite as C
from mindspore import Tensor
import numpy as np
x1 = Tensor(np.array([1,2]),mstype.float32)
y1 = Tensor(np.array([[1],[2]]),mstype.float32)
output = C.matmul(x1,y1)
print(output)
运行截图:
可以看到实现matmul算子实现了两个数组的矩阵乘积,大家也可以尝试不同的数据来验证,要注意的是这里我的环境是CPU,在该环境下matmul中的参数只支持传入dtype.float32和dtype.float16,不支持传入numpy中的参数out、casting、order、subok、signature和exextbj。
最后一个我要讲的就是上述的三类算子(operations,functional,composite)的一起使用。这个说是一起使用吧,但也没这么么复杂,就是在导包时不用再导入operations,functional,composite这3个细节部分了,直接导入ops就行,然后直接调用ops中对应的算子或函数就行。直接用代码举例。
import mindspore.ops.operations as P
Sigmoid = P.Sigmoid()
import mindspore.ops as P
Sigmoid = P.Sigmoid()
这两种写法的实际效果完全相同,那我们为了方便肯定会选择第二种写法的。
注:本文示例代码的编译环境为MindSpore1.3.0 CPU版本
本篇文章到这里就差不多结束了,在下一篇中我将为大家继续介绍一些关于算子方面的其他知识点,大家可前往官方文档查看内容,我也在上面借鉴了很多内容。 由于本人知识有限,若有错误,还请多多包涵与指教!