深度神经网络--3.4 用MindSpore实现简单神经网络
说明:随着开发迭代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 训练网络模型
- 点赞
- 收藏
- 关注作者
评论(0)