昇思——nn模块总览
开始本篇文章前,插一条MindSpore的社区公告。
亲爱的MindSpore用户:
在MindSpore发布1.5版本之际,告诉大家一个好消息,MindSpore有中文名啦。作为中文世界如此受欢迎的AI框架,我们给它取了一个响亮的名字“昇思”,顾名思义,昇思MindSpore时刻都在思考用户需求,努力为用户提供开发友好、运行高效、部署灵活的开发体验,推动人工智能产学研生态繁荣发展。
2021年9月25日
不知不觉间,MindSpore也有了自己的专属中文名字。想当初刚接触MindSpore的时候还听着各位大佬用头孢来称呼MindSpore,以为那就是MindSpore的官方名字,但现在看来还是昇思这个名字更加具有深意。现在我的设备上装的还是CPU 1.3.0版本的MindSpore,两个月前的这个时候,它还是最新版本的MindSpore。在这两个月的时期内,MindSpore连续更新了两个版本,由此可见MindSpore的相关社区还是比较活跃的。相信未来MindSpore一定会做的越来越好!
网络
神经网络是深度学习的基石,下图是一个经典的神经网络。它包含三个层次,红色的是输入层,绿色的是输出层,紫色的是中间层(有些场合也被叫做隐藏层),输入层有3个输入单元,隐藏层有4个单元,输出层有2个单元。
虽然说这个网络算不上深度神经网络,但也是具有基本规模。在监督学习的问题中,我们只需要将图中的中间层换成多几个具有特征的层,包括卷积层,池化层,连接层等,就可以形成一个普通的深度神经网络了。
MindSpore作为一款开源的深度学习框架,它的很大一个目的就是降低AI开发的门槛,同时减轻深度学习专家们的编码任务。网络是每个深度学习任务都不可或缺的东西,因此MindSpore自然为我们造好了关于神经网络的轮子,我们可以直接调用它们来完成我们所需要的网络构建。
nn模块
概述
nn模块中的cell类是构建所有网络的基类,也是网络的基本单元。当用户需要自定义网络时,需要继承Cell
类,并重写__init__
方法和construct
方法。
损失函数、优化器和模型层等本质上也属于网络结构,也需要继承Cell
类才能实现功能,同样用户也可以根据业务需求自定义这部分内容。
简单来说,__init__
方法是用来初始化整个神经网络,包括其中的所需用使用到的激活函数算子,卷积层算子,池化层算子,全连接层算子。而construct
方法就是用来将这些算子按照一定的顺序作用在输入的数据集上,逐步地得到最终的值。
nn模块与ops模块
我们都知道MindSpore中有个专门的ops模块用来向用户提供算子接口,但我们在构建神经网络时并没有使用到ops模块中的算子,反而是在使用nn模块中的算子,这是为什么呢?nn模块与ops模块之间的算子又有什么联系呢?
MindSpore的nn模块是Python实现的模型组件,是对低阶API的封装,主要包括各种模型层、损失函数、优化器等。同时nn也提供了部分与Primitive
算子同名的接口,主要作用是对Primitive
算子进行进一步封装,为用户提供更友好的API。比如说nn模块中有一个名为nn.Conv2d的算子,它可以对输入的数据进行卷积运算,其内部会调用ops.Conv2D
。nn.Conv2d
卷积API增加输入参数校验功能并判断是否bias
等,是一个高级封装的模型。
网络参数
MindSpore中提供了一个Initializer类,它是框架中用于进行初始化的基本数据结构。其子类包含了几种不同类型的数据分布(Zero,One,XavierUniform,HeUniform,HeNormal,Constant,Uniform,Normal,TruncatedNormal)。
使用initializer进行参数初始化时,支持传入的参数有init
、shape
、dtype
:
init
:支持传入Tensor
、str
、Initializer的子类
。shape
:支持传入list
、tuple
、int
。dtype
:支持传入mindspore.dtype
。
Initializer子类是我们用来初始化网络参数的中坚力量。MindSpore中提供了网络参数的初始化模块,用户可以之间通过封装算子来来调用字符串、Initializer子类或自定义Tensor等方式完成对网络参数进行初始化。
损失函数
损失函数,又叫目标函数,用于衡量预测值与真实值差异的程度。在深度学习中,模型训练就是通过不停地迭代来缩小损失函数值的过程。因此,在模型训练过程中损失函数的选择非常重要,定义一个好的损失函数,可以有效提高模型的性能。损失函数也可以算作是网络的一部分,在nn模块中也封装了很多内置的常用的损失函数算子,我们可以直接通过API来调用它。
MindSpore提供了许多通用损失函数供用户选择,但这些通用损失函数并不适用于所有场景,很多情况需要用户自定义所需的损失函数。因此,本教程介绍损失函数的写作方法。
目前MindSpore主要支持的损失函数有L1Loss
、MSELoss
、SmoothL1Loss
、SoftmaxCrossEntropyWithLogits
、SampledSoftmaxLoss
、BCELoss
和CosineEmbeddingLoss
。
同时,MindSpore的所有损失函数都是由cell的子类实现的,所以在一些特定场合,如果我们需要使用特定的损失函数的话,我们可以自定义一个类去实现它,只要最后这个类是继承自cell基类就可以了。
最后不得不说,在MindSpore更新到1.5版本之后,API文档也得到了大幅度升级,变得比以前更加的详细,还添加了许多的东西。但还是希望能多出一些有利于小白或者是新手的说明文档,这样可以使小白不那么快的拒之门外。