当前位置:   article > 正文

用于图像识别的深度残差学习

图像识别的深度残差学习

Deep Residual Learning for Image Recognition(ResNet)
用于图像识别的深度残差学习
摘要
由于越深的神经网络训练起来越来困难,所以本文提出了一种残差学习框架,用于简化网络层次比较深的模型。这个ResNet框架使得网络层次可能根据输入来学习残差函数而非原始函数(unreferenced functions),本文已经证明,这些残差网络的优化更加简单,并且可以是的更深的层来获得更高的准确率,这些残差组合模型在ImageNet测试集上的错误率仅3.57%,这个结果在2015年的ILSVRC分类任务上获得了第一名的成绩。
一、introduction
1、随着网络越来越深,梯度就会出现爆炸或者消失。
解决的办法:

  • 在初始化的时候要做好一点,就是权重在随机初始化的时候,权重不要特别大也不要特别小。
  • 在中间加入一些normalization,包括BN(batch
    normalization)可以使得校验每个层之间的那些输出和他的梯度的均值和方差相对来说比较深的网络是可以训练的。
  • 文章提出出现精度变差的问题不是因为层数变多了,模型变复杂了导致的过拟合,而是因为训练误差也变高了(overfitting是说训练误差变得很低,但是测试误差变得很高),训练误差和测试误差都变高了,虽然网络是收敛的,但是好像没有训练出一个好的结果(红线在黄线上面,就是网络变深,错误率下降)

2、深入讲述深度增加之后精度也会变差

  • 考虑一个比较浅一点的网络和它对应的比较深的神经网络(在浅的网络中再多加一些层进去),如果浅的神经网络效果还不错的话,深的神经网络是不应该变差的,这是因为深的网络新加的那些层,总是可以把这些层学习的变成一个identity
    mapping(恒等映射作为跳跃连接和加和的激活项,能使得前向和反向的信号能直接在模块之间传播)但是实际情况是,虽然理论上权重是可以学习成这样,但是实际上做不到:假设让SGD去优化,深层学到一个跟那些浅层网络精度比较好的一样的结果,上面的层变成identity(相对于浅层神经网络,深层神经网络中多加的那些层全部变成identity),这样的话精度不应该会变差,应该是跟浅层神经网络是一样的,但是实际上SGD(梯度下降法)找不到这种最优解。
  • 这篇文章提出显式地构造出一个identity mapping,使得深层的神经网络不会变的比相对较浅的神经网络更差,它将其称为deep
    residual learning framework

在这里插入图片描述图1
如图1所示:要学的东西叫做H(x)(红色),假设现在已经有了一个浅的神经网络(蓝色),它的输出是x,然后要在这个浅的神经网络上面再新加一些层,让它变得更深。新加的那些层不要直接去学H(x),而是应该去学H(x)-x,x是原始的浅层神经网络已经学到的一些东西,新加的层不要重新去学习,而是去学习学到的东西和真实的东西之间的残差,最后整个神经网络的输出等价于浅层神经网络的输出x和新加的神经网络学习残差的输出之和,将优化目标从H(x)转变成为了H(x)-x。这样的好处是:只是加了一个东西进来,没有任何可以学的参数,不会增加任何的模型复杂度,也不会使计算变得更加复杂,而且这个网络跟之前一样,也是可以训练的,没有任何改变。
解释:什么是残差????
ResNet提出了两种mapping:
一种是identity mapping,指的就是图1中”弯弯的曲线”,
另一种residual mapping,指的就是除了”弯弯的曲线“那部分,所以最后的输出是 y=F(x)+x

二、相关工作(relateed work)
1、残差连接如何处理输入和输出的形状是不同的情况:

  • 第一个方案是在输入和输出上分别添加一些额外的0,使得这两个形状能够对应起来然后可以相加;
  • 第二个方案是之前提到过的全连接做投影,到卷积上是通过一个叫做11的卷积层,这个卷积层的特点是在空间维度上不做任何处理,主要是在通道维度上做改变。所以只要选取一个11的卷积使得输出通道是输入通道的两倍,这样就能将残差连接的输入和输出进行对比了(???)。在ResNet中,如果把输出通道数翻了两倍,那么输入的高和宽通常都会被减半,所以在做1*1的卷积的时候,同样也会使步幅为2,这样的话使得高宽和通道上都能够匹配上

2、implementation中讲了实验的一些细节

  • 把短边随机的采样到256和480

  • 使用了颜色的增强(AlexNet上用的是PCA,现在我们所使用的是比较简单的RGB上面的,调节各个地方的亮度、饱和度等)类似PS的工作批量大小是56,学习率是0.1,然后每一次当错误率比较平的时候除以10。

  • 模型训练了60*10^4个批量

  • 在测试的时候使用了标准的10个crop-testing(给定一张测试图片,会在里面随机的或者是按照一定规则的去采样10个图片出来,然后再每个子图上面做预测,最后将结果做平均)

在这里插入图片描述
图二
三、Experiments
在这里插入图片描述
图三

  • 上表是整个ResNet不同架构之间的构成信息(5个版本)
  • 第一个7*7的卷积是一样的
  • 接下来的pooling层(池化层)也是一样的
  • 最后的全连接层也是一样的
  • 不同的架构之间,主要是中间部分不一样,也就是那些复制的卷积层是不同的
  • conv2.x:x表示里面有很多不同的层(块)
  • 【3*3,64】:64是通道数
    在这里插入图片描述图四
  • 上图中比较了18层和34层在有残差连接和没有残差连接的结果
  • 一开始训练精度是要比测试精度高的,因为在一开始的时候使用了大量的数据增强,使得寻来你误差相对来说是比较大的,而在测试的时候没有做数据增强,噪音比较低,所以一开始的测试误差是比较低的
  • 上图主要是想说明在有残差连接的时候,34比18要好;另外对于34来说,有残差连接会好很多;其次,有了残差连接以后,收敛速度会快很多,核心思想是说,在所有的超参数都一定的情况下,有残差的连接收敛会快,而且后期会好。
  • 输入输出形状不一样的时候怎样做残差连接
  • 填零
  • 投影
  • 所有连接都做投影
    对比以上三种残差连接的三种方法
    在这里插入图片描述图五
  • A表示填0;
  • B表示在不同的时候做投影;
  • C表示全部做投影;
  • B和C的表现差不多,但是还是要比A好一点;
  • B和C虽然差不多,但是计算复杂度更高,B对计算量的增加比较少,作者采用了B。

怎样构建更深的ResNet
在这里插入图片描述
图六

  • 左图是之前的设计,当通道数是64位的时候,通道数不会发生改变
  • 如果要做到比较深的话,可以学到更多的模式,可以把通道数变得更大,右图从64变到了256
  • 当通道数变得更大的时候,计算复杂度成平方关系增加,这里通过1个1*1的卷积,将256维投影回到64维,然后再做通道数不变的卷积,然后再投影回256(将输入和输出的通道数进行匹配,便于进行对比)。等价于先对特征维度降一次维,在降一次维的上面再做一个空间上的东西,然后再投影回去。
  • 虽然通道数是之前的4倍,但是在这种设计之下,二者的算法复杂度是差不多的

在这里插入图片描述
图七
在整个残差连接,如果后面新加上的层不能让模型变得更好的时候,因为有残差连接的存在,新加的那些层应该是不会学到任何东西,应该都是靠近0的,这样就等价于就算是训练了1000层的ResNet,但是可能就前100层有用,后面的900层基本上因为没有什么东西可以学的,基本上就不会动了。

mAP:目标检测上最常见的一个精度,锚框的平均精度,越高越好

为什么ResNet训练起来比较快?
因为梯度上保持的比较好,新加一些层的话,加的层越多,梯度的乘法就越多,因为梯度比较小,一般是在0附近的高斯分布,所以就会导致在很深的时候就会比较小(梯度消失)。虽然batch normalization或者其他东西能够对这种状况进行改善,但是实际上相对来说还是比较小,但是如果加了一个ResNet的话,它的好处就是在原有的基础上加上了浅层网络的梯度,深层的网络梯度很小没有关系,浅层网络可以进行训练,变成了加法,一个小的数加上一个大的数,相对来说梯度还是会比较大的。也就是说,不管后面新加的层数有多少,前面浅层网络的梯度始终是有用的,这就是从误差反向传播的角度来解释为什么训练的比较快。
参考链接

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/863175
推荐阅读
相关标签
  

闽ICP备14008679号