MindSpore深度学习框架MindSpore中的Cell模块

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MindSpore深度学习框架MindSpore中的Cell模块相关的知识,希望对你有一定的参考价值。


文章目录

  • ​​一、概述​​
  • ​​二、ops构建网络​​
  • ​​三、nn构建网络​​
  • ​​四、nn模块和ops的关系​​
  • ​​五、网络的常用方法​​
  • ​​1.parameters_dict()​​
  • ​​2.get_parameters()​​
  • ​​3.name_cells()​​
  • ​​4.cells_and_names()​​
  • ​​5.cells()​​

欢迎回到MindSpore神经网络编程系列。在这篇文章中,我们将通过MindSpore来讲解下该框架中的Cell模块。废话不多说,我们开始吧。

【MindSpore深度学习框架】MindSpore中的Cell模块_人工智能


一、概述

MindSpore的​​Cell​​​类是构建所有网络的基类,也是网络的基本单元。当用户需要自定义网络时,需要继承​​Cell​​​类,并重写​​__init__​​​方法和​​construct​​方法。

损失函数、优化器和模型层等本质上也属于网络结构,也需要继承​​Cell​​类才能实现功能,同样用户也可以根据业务需求自定义这部分内容。

本节内容介绍​​Cell​​​类的关键成员函数,“构建网络”中将介绍基于​​Cell​​​实现的MindSpore内置损失函数、优化器和模型层及使用方法,以及通过实例介绍如何利用​​Cell​​类构建自定义网络。

  • _init_:在该函数中定义网络所需要的层或者变量等信息
  • construct:该函数实现网络的执行流程

二、ops构建网络

这里首先我们使用了ops中的Conv2D算子,然后又使用了bias_add算子,同时定义下模型的权重,之后在construct函数中定义网络的执行流程。

代码样例如下:

class Net(nn.Cell):
def __init__(self,in_channels=10,out_channels=20,kernel_size=3):
super(Net,self).__init__()
self.conv2d=ops.Conv2D(out_channels,kernel_size)
self.bias_add=ops.BiasAdd()
self.weight=Parameter(initializer(normal,[out_channels,in_channels,kernel_size,kernel_size]),name=conv.weight)

def construct(self,x):
output=self.conv2d(x,self.weight)
output=self.bias_add(output,self.bias)
return output

三、nn构建网络

对于nn模块构建网络,非常的方便,它是mindSpore封装的高阶API,简单调用。

代码样例如下:

class Net(nn.Cell):
def __init__(self,in_channels=10,out_channels=20,kernel_size=3):
super(Net,self).__init__()
self.conv2d=nn.Conv2d(in_channels,out_channels,kernel_size,has_bias=True,weight_init=Normal(0.02))

def construct(self,x):
output=self.conv2d(x)
return output

四、nn模块和ops的关系

MindSpore的nn模块是Python实现的模型组件,是对低阶API的封装,主要包括各种模型层、损失函数、优化器等。

同时nn也提供了部分与​​Primitive​​​算子同名的接口,主要作用是对​​Primitive​​算子进行进一步封装,为用户提供更友好的API。

重新分析上文介绍​​construct​​​方法的用例,此用例是MindSpore的​​nn.Conv2d​​​源码简化内容,内部会调用​​ops.Conv2D​​​。​​nn.Conv2d​​​卷积API增加输入参数校验功能并判断是否​​bias​​等,是一个高级封装的模型层。

五、网络的常用方法

1.parameters_dict()

该方法会以字典的形式返回网络的所有参数,键为参数的名称,值为对应的参数

class Net(nn.Cell):
def __init__(self,in_channels=10,out_channels=20,kernel_size=3):
super(Net,self).__init__()
self.conv2d=ops.Conv2D(out_channels,kernel_size)
self.bias_add=ops.BiasAdd()
self.weight=Parameter(initializer(normal,[out_channels,in_channels,kernel_size,kernel_size]),name=conv.weight)

def construct(self,x):
output=self.conv2d(x,self.weight)
output=self.bias_add(output,self.bias)
return output

net=Net()
net.parameters_dict()

>>>OrderedDict([(conv.weight,
Parameter (name=conv.weight, shape=(20, 10, 3, 3), dtype=Float32, requires_grad=True))])

2.get_parameters()

该方法返回一个迭代器,返回的是模型的参数,就是返回上个方法的所以值

iter=net.get_parameters()
next(iter)

>>>Parameter (name=conv2d.weight, shape=(20, 10, 3, 3), dtype=Float32, requires_grad=True)

3.name_cells()

返回网络中所有单元格的迭代器

net.name_cells()

>>>OrderedDict([(conv2d,
Conv2d<input_channels=10, output_channels=20, kernel_size=(3, 3), stride=(1, 1), pad_mode=same, padding=0, dilation=(1, 1), group=1, has_bias=True, weight_init=<mindspore.common.initializer.Normal object at 0x0000023FABF21248>, bias_init=zeros, format=NCHW>)])

4.cells_and_names()

返回网络中所有单元格的迭代器,包括单元格的名称和它本身

注意第一个返回的是整个网络,键对应着空

names=[]
for m in net.cells_and_names():
print(m)
names.append(m[0]) if m[0] else None
print(-------names-------)
print(names)

(, Net<
(conv2d): Conv2d<input_channels=10, output_channels=20, kernel_size=(3, 3), stride=(1, 1), pad_mode=same, padding=0, dilation=(1, 1), group=1, has_bias=True, weight_init=<mindspore.common.initializer.Normal object at 0x0000023FABF21248>, bias_init=zeros, format=NCHW>
>)
(conv2d, Conv2d<input_channels=10, output_channels=20, kernel_size=(3, 3), stride=(1, 1), pad_mode=same, padding=0, dilation=(1, 1), group=1, has_bias=True, weight_init=<mindspore.common.initializer.Normal object at 0x0000023FABF21248>, bias_init=zeros, format=NCHW>)
-------names-------
[conv2d]

5.cells()

返回对直接单元格的迭代器

net.cells()

>>>odict_values([Conv2d<input_channels=10, output_channels=20, kernel_size=(3, 3), stride=(1, 1), pad_mode=same, padding=0, dilation=(1, 1), group=1, has_bias=True, weight_init=<mindspore.common.initializer.Normal object at 0x0000023FABF21248>, bias_init=zeros, format=NCHW>])

​上面的几个方法几乎差不多,按照自己喜好进行选择使用​

写在最后

      一键三连”哦!!!

【MindSpore深度学习框架】MindSpore中的Cell模块_深度学习_02


以上是关于MindSpore深度学习框架MindSpore中的Cell模块的主要内容,如果未能解决你的问题,请参考以下文章

云原生生态系统赋能新的开源深度学习框架MindSpore

自动驾驶深度学习计算框架有了新选择,华为发布全场景AI计算框架MindSpore

2款AI芯片深度学习框架MindSpore:华为史无前例集中发布AI战略

昇思MindSpore安装教程

应对全场景AI框架部署挑战,MindSpore“四招”让你躺平

华为开源自研AI框架昇思MindSpore入门体验:手写数字识别