深度神经网络--3.4 用MindSpore实现简单神经网络

举报
HWCloudAI 发表于 2020/12/24 14:43:27 2020/12/24
【摘要】 说明:随着开发迭代MindSpore的接口及流程的不断演进,书中代码仅为示意代码,完整可运行代码请大家以线上代码仓中对应章节代码为准。网址为:https://mindspore.cn/resource。读者可扫描右侧二维码获取相关资源。LeNet主要用来进行手写字符的识别与分类,并已在美国的银行中投入使用。LeNet的实现确立了卷积神经网络(CNN)的结构,现在神经网络中的许多内容在LeNe...

说明:随着开发迭代MindSpore的接口及流程的不断演进,书中代码仅为示意代码,完整可运行代码请大家以线上代码仓中对应章节代码为准。网址为:https://mindspore.cn/resource。读者可扫描右侧二维码获取相关资源。LeNet主要用来进行手写字符的识别与分类,并已在美国的银行中投入使用。LeNet的实现确立了卷积神经网络(CNN)的结构,现在神经网络中的许多内容在LeNet的网络结构中都能看到,例如卷积层、池化(Pooling)层和ReLU层。虽然LeNet早在20世纪90年代就已经提出,但由于当时缺乏大规模的训练数据,计算机硬件的性能也较低,LeNet神经网络在处理复杂问题时效果并不理想。LeNet网络结构比较简单,刚好适合神经网络的入门学习。

3.4.1 各层参数说明LeNet-5是早期卷积神经网络中最有代表性的实验系统之一,它共有7层(不包含输入层),每层都包含可训练参数和多个特征图(Feature Map),每个特征图通过一种卷积滤波器提取输入的一种特征,每个特征图有多个神经元。1. Input层——输入层首先是数据Input层,输入图片的尺寸统一归一化为32×32。需要注意的是,本层不算LeNet-5的网络结构,传统上不将输入层视为网络层次结构之一。

2. C1层——卷积层C1层详细信息如下:(1)输入图片大小:32×32。(2)卷积核大小:5×5。(3)卷积核种类:6。(4)输出特征图大小:28×28(28由“32-5+1”计算得出)。(5)神经元数量:28×28×6=4704。(6)可训练参数:(5×5+1)×6=156。(7)连接数:(5×5+1)×6×28×28=122 304。3. S2层——池化层(降采样层)S2层详细信息如下:(1)输入大小:28×28。(2)采样区域:2×2。(3)采样方式:4个输入相加,乘以可训练参数,再加上可训练偏置。(4)采样种类:6。(5)输出特征图大小:14×14(14由28/2计算得出)。(6)神经元数量:14×14×6=1176。(7)可训练参数:2×6=12。(8)连接数:(2×2+1)×6×14×14=5880。S2中每个特征图的大小是C1中特征图大小的1/4。

4. C3层——卷积层C3层详细信息如下:(1)输入:S2中所有6个或者几个特征图组合。(2)卷积核大小:5×5。(3)卷积核种类:16。(4)输出特征图大小:10×10(C3中的每个特征图是连接到S2中的所有6个特征,表示本层的特征图是上一层提取到的特征图的不同组合)。(5)可训练参数:6×(3×25+1)+6×(4×25+1)+3×(4×25+1)+(25×6+1)=1516。(6)连接数:10×10×1516=151600。

5. S4层——池化层(降采样层)S4层详细信息如下:(1)输入大小:10×10。(2)采样区域:2×2。(3)采样方式:4个输入相加,乘以可训练参数,再加上可训练偏置。(4)采样种类:16。(5)输出特征图大小:5×5(5由10/2计算得出)。(6)神经元数量:5×5×16=400。(7)可训练参数:2×16=32。(8)连接数:16×(2×2+1)×5×5=2000。S4中每个特征图的大小是C3中特征图大小的1/4。

6. C5层——卷积层

C5层详细信息如下:(1)输入:S4层的全部16个单元特征图(与S4全连接)。(2)卷积核大小:5×5。(3)卷积核种类:120。(4)输出特征图大小:1×1(1由5-5+1计算得出)。(5)可训练参数/连接:120×(16×5×5+1)=48120。

7. F6层——全连接层F6层详细信息如下:(1)输入:C5 120维向量。(2)计算方式:计算输入向量和权重向量之间的点积,再加上偏置。(3)可训练参数:84×(120+1)=10164。8. Output层——全连接层Output层也是全连接层,共有10个节点,分别用数字0~9表示。3.4.2 详细步骤下面描述使用LeNet网络训练和推理的详细步骤,并给出示例代码。1. 加载MindSpore模块使用MindSpore API前需要先导入MindSpore API和辅助模块,如代码3.1所示。

代码3.1 导入MindSpore API和辅助模块

2. 导入数据集使用MindSpore数据格式API创建Mnist数据集,其中下面调用的train_dataset()函数具体实现和MindSpore数据格式API介绍详见第14章。3. 定义LeNet网络定义LeNet-5网络结构,核心代码如代码3.2所示。

3. 定义LeNet网络定义LeNet-5网络结构,核心代码如代码3.2所示。

代码3.2 定义LeNet-5网络结构

__init__()函数完成了卷积层和全连接层的初始化。初始化参数包括输入个数、输出个数、卷积层的参数以及卷积核大小。因为原始数据集的图片大小是28×28,所以在导入数据集的过程中,需要将输入大小转变成32×32。construct()函数实现了前向传播。根据定义对输入依次进行卷积、激活、池化等操作,最后返回计算结果。在全连接层之前,先对数据进行展开操作,使用Flatten()函数实现,这个函数可以在保留第0轴的情况下,对输入的张量进行扁平化(Flatten)处理。

4. 设置超参数并创建网络定义损失函数和优化器。损失函数定义为SoftmaxCrossEntropyWithLogits,采用Softmax进行交叉熵计算。选取Momentum优化器,学习率设置为0.1,动量为0.9,核心代码如代码3.3所示。

代码3.3 设置超参数并创建网络

5. 训练网络模型把网络、损失函数和优化器传入模型中,调用train()方法即可开始训练,核心代码如代码3.4所示。

代码3.4 训练网络模型

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。