乐趣区

关于算法:MindSpore网络实战系列使用ResNet50实现图像分类任务


摘要:

承接上一篇 LeNet 网络模型的图像分类实际,本次咱们再来意识一个新的网络模型:ResNet-50。不同网络模型之间的次要区别是神经网络层的深度和层与层之间的连贯形式,注释内容咱们就剖析下应用 ResNet-50 进行图像分类有什么神奇之处,以下操作应用 MindSpore 框架实现。

1. 网络:ResNet-50

对于相似 LeNet 网络模型深度较小并且参数也较少,训练起来会绝对简略,也很难会呈现梯度隐没或爆炸的状况。但 ResNet-50 的深度较大,训练起来就会比拟艰难,所以在加深网络深度的同时提出残差学习的构造来加重深层网络训练的难度。从新构建了网络以便学习蕴含推理的残差函数,而不是学习未通过推理的函数。试验结果显示,残差网络更容易优化,并且加深网络层数有助于进步正确率。

深度模型的限度
深度卷积网络在图像分类工作上有十分优良的体现。深度网络依赖于多层端到端的形式,集成了低中高三个档次的特色和分类器,并且这些特色的数量还能够通过重叠层数来减少。这也展现出了网络深度十分重要。

然而随着网络层数的减少,训练时就会遇到梯度隐没或爆炸的状况,这会在一开始就影响收敛。收敛的问题能够通过正则化来失去局部的解决,但也不是通用的办法。并且在深层网络可能收敛的前提下,随着网络深度的减少,正确率开始饱和甚至降落,称之为网络的进化。

图 1:56 层和 20 层网络效果图

通过上图 1 能够发现在不扭转网络结构的状况下,仅加深网络深度的 56 层网络相较于 20 层在误差上体现都更大。

ResNet-50 的残差构造
对于网络进化景象并不是过拟合造成的。在给定的网络上减少层数就会增大训练误差。这阐明不是所有的零碎都很容易优化。咱们能够先剖析一个浅层的网络架构和在它根底上构建的深层网络,如果减少的所有层都是前一层的间接复制(即 y =x),这种状况下深层网络的训练误差应该和浅层网络相等。因而,网络进化的根本原因还是优化问题。为了解决优化的难题,大佬们提出了残差网络,在 ResNet-50 中残差网络结构可分为 Identity Block 和 Conv Block,上面别离介绍下。

Identity Block:在残差网络中,不是让网络间接拟合原先的映射,而是拟合残差映射。意味着前面的特色层的内容会有一部分由后面的某一层线性奉献。假如原始的映射为 H(x),残差网络拟合的映射为:F(x):=H(x)。输出和输入的维度(通道数和 Size)是一样的,所以能够串联,它的次要用途是加深网络的深度。

图 2:Identity Block 构造

如图 2 中所示,identity mapping 会间接跳过两头一些网络层,建设了一些快捷链接,间接恒等映射过来。这样的快捷链接不会减少模型的复杂度和参数。

Conv Block:在 Identity Block 的残差构造根底上,又减少了 Conv 的过程。输出和输入的维度(通道数和 Size)是不一样的,所以不能进行间断的串联,它的作用是扭转网络的维度,所以残差边上新增了卷积。

图 3:Conv Block 构造

如图 3 中所示,Conv Block 将在残差的通道上通过一轮卷积解决。再将卷积解决后的后果给到前面的网络层中。

Conv Block 的具体设置须要看 Block 的输出和输入,对照通道数和 Size 的变动,设定合乎需要的 Conv。

ResNet-50 的整体构造
下面理解完了残差构造和用处,当初咱们再带入到 ResNet-50 中看下整体的构造

图 4:ResNet 结构图

从左到右顺次的剖析,图 4 最右边是 ResNet-50 的步骤图,前面是将每个步骤再拆解 Input stem 是失常的输出和解决。Stage1->Stage4 就是蕴含了加深网络深度的 Identity Block 和 Conc Block 的模块,同时防止了计算训练艰难和网络的进化的问题。

ResNet-50 的调用
MindSpore 已上线反对该模型,咱们能够间接调用该模型的接口,所以咱们在应用过程中传入定义好的超参数和数据即可。

如果想要理解下更底层的参数设置,能够查看 https://gitee.com/mindspore/m…。

论文链接:https://arxiv.org/pdf/1512.03…

2. 数据集:CIFAR-10

数据集 CIFAR-10 由 10 个类的 60000 个 32×32 彩 ** 像组成,每个类有 6000 个图像。有 50000 个训练图像和 10000 个测试图像。

数据集构造
CIFAR-10 数据集的原文连贯中蕴含三种类型的数据集,这里能够依据本人的需要进行下载。这里咱们应用 python 版本数据集。

Version                                               Size

CIFAR-10 python version                                     163 MB

CIFAR-10 Matlab version                                     175 MB

CIFAR-10 binary version (suitable for C programs)                   162 MB

数据集中所蕴含的类别

 

图 5:CIFAR-10 类别图

数据加载和解决
数据加载:下载实现后将数据集放在一个文件目录下,将目录传入到数据的加载过程中。

数据加强:是对数据进行归一化和丰盛数据样本数量。常见的数据加强形式包含裁剪、翻转、色调变动等等。MindSpore 通过调用 map 办法在图片上执行加强操作。

最初通过数据混洗(shuffle)随机打乱数据的程序,并按 batch 读取数据,进行模型训练。

3. 损失函数:SoftmaxCrossEntropyWithLogits

本次训练调用的损失函数是:SoftmaxCrossEntropyWithLogits。那为什么是 SoftmaxCrossEntropyWithLogits 损失函数呢?

损失函数的抉择
咱们下面提到,为什么是应用 SoftmaxCrossEntropyWithLogits 损失函数呢,这要从咱们本次的试验目标剖析。

本次我的项目的:实现 CIFAR-10 图像数据集的分类。既然是分类,那么分类中的损失函数是怎么计算的,它是计算 logits 和标签之间的 softmax 穿插熵。应用穿插熵损失测量输出概率(应用 softmax 函数计算)与类别互斥(只有一个类别为正)的指标之间的散布误差,具体公式能够示意成

图 6:SoftmaxCrossEntropyWithLogits 表达式

损失函数参数剖析
logits (Tensor) – Tensor of shape (N, C). Data type must be float16 or float32.
labels (Tensor) – Tensor of shape (N,). If sparse is True, The type of labels is int32 or int64. Otherwise, the type of labels is the same as the type of logits.
第一个参数 logits:就是神经网络最初一层的输入,如果有 batch 的话,它的大小就是[batchsize,num_classes],单样本的话,大小就是 num_classes;第二个参数 labels:理论的标签,大小同上。

损失函数的应用
更具体的应用请参考 SoftmaxCrossEntropyWithLogits API 链接:https://mindspore.cn/docs/api…

4. 优化器:Momentum

本次训练中咱们应用的是 Momentum,也叫动量优化器。为什么是它?上面咱们理解下它的计算原理。

优化器的计算

图 7:Momentum 表达式

下面表达式中的 grad、lr、p、v 和 u 别离示意梯度、learning_rate、参数、矩和动量。其中的梯度是通过损失函数求导得出的,在训练过程中失去的 Loss 是一个间断值,那么它就有梯度可求,并反向流传给每个参数。Momentum 优化器的次要思维就是利用了相似挪动指数加权均匀的办法来对网络的参数进行平滑解决的,让梯度的摆动幅度变得更小。

优化器的应用
更具体的应用请参考 Momentum API 链接:https://mindspore.cn/docs/api…

5. 评估指标:Accuracy

损失函数的值尽管能够反馈网络的性能,但对于图片分类的工作,应用精度能够更加精确的示意最终的分类后果。

精度指标的抉择
基于分类工作的思考,咱们应用简略的 分类正确数量 / 总数量 来示意,也就是 Accuracy。精度表达式比较简单,也好了解。

图 8:Accuracy 达式

精度的应用
更具体的应用请参考 Accuracy API 链接:https://mindspore.cn/docs/api…

总结:

本次内容是以图像分类工作为例,首先要理解下咱们本次应用的模型构造以及要实现的指标,本次内容和 LeNet 网络图像分类的区别是应用网络和数据集的不同,所以可重点对照下两种网络结构。而后是抉择设置失函数、优化器和精度这几局部,形成残缺的训练。谢谢赏阅。

退出移动版