昇思——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个单元。

image.png

虽然说这个网络算不上深度神经网络,但也是具有基本规模。在监督学习的问题中,我们只需要将图中的中间层换成多几个具有特征的层,包括卷积层,池化层,连接层等,就可以形成一个普通的深度神经网络了。

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.Conv2Dnn.Conv2d卷积API增加输入参数校验功能并判断是否bias等,是一个高级封装的模型。

网络参数

MindSpore中提供了一个Initializer类,它是框架中用于进行初始化的基本数据结构。其子类包含了几种不同类型的数据分布(Zero,One,XavierUniform,HeUniform,HeNormal,Constant,Uniform,Normal,TruncatedNormal)。

使用initializer进行参数初始化时,支持传入的参数有initshapedtype

  • init:支持传入Tensor、 str、 Initializer的子类
  • shape:支持传入list、 tuple、 int
  • dtype:支持传入mindspore.dtype

Initializer子类是我们用来初始化网络参数的中坚力量。MindSpore中提供了网络参数的初始化模块,用户可以之间通过封装算子来来调用字符串、Initializer子类或自定义Tensor等方式完成对网络参数进行初始化。

损失函数

损失函数,又叫目标函数,用于衡量预测值与真实值差异的程度。在深度学习中,模型训练就是通过不停地迭代来缩小损失函数值的过程。因此,在模型训练过程中损失函数的选择非常重要,定义一个好的损失函数,可以有效提高模型的性能。损失函数也可以算作是网络的一部分,在nn模块中也封装了很多内置的常用的损失函数算子,我们可以直接通过API来调用它。

MindSpore提供了许多通用损失函数供用户选择,但这些通用损失函数并不适用于所有场景,很多情况需要用户自定义所需的损失函数。因此,本教程介绍损失函数的写作方法。

目前MindSpore主要支持的损失函数有L1LossMSELossSmoothL1LossSoftmaxCrossEntropyWithLogitsSampledSoftmaxLossBCELossCosineEmbeddingLoss

同时,MindSpore的所有损失函数都是由cell的子类实现的,所以在一些特定场合,如果我们需要使用特定的损失函数的话,我们可以自定义一个类去实现它,只要最后这个类是继承自cell基类就可以了。

最后不得不说,在MindSpore更新到1.5版本之后,API文档也得到了大幅度升级,变得比以前更加的详细,还添加了许多的东西。但还是希望能多出一些有利于小白或者是新手的说明文档,这样可以使小白不那么快的拒之门外。

posted @ 2021-12-30 19:40  MS小白  阅读(123)  评论(0)    收藏  举报