ResNet深度学习网络--结构简介

参考博文:https://blog.csdn.net/qq_31622015/article/details/89811456

1、ResNet解决了什么?

  随着网络的加深,出现了训练集准确率下降的现象,我们可以确定这不是由于Overfit过拟合造成的(过拟合的情况训练集应该准确率很高)。传统的卷积网络或者全连接网络在信息传递的时候或多或少会存在信息丢失,损耗等问题,同时还有导致梯度消失或者梯度爆炸,阻碍网络收敛,导致很深的网络无法训练。

  ResNet(Residual Neural Network)由微软研究院的Kaiming He等四名华人提出,通过使用ResNet Unit成功训练出了152层的神经网络,并在ILSVRC2015比赛中取得冠军,在top5上的错误率为3.57%,同时参数量比VGGNet低,效果非常突出。ResNet的结构可以极快的加速神经网络的训练,模型的准确率也有比较大的提升。同时ResNet的推广性非常好,甚至可以直接用到InceptionNet网络中。ResNet的主要思想是在网络中增加了直连通道,即Highway Network的思想。此前的网络结构是性能输入做一个非线性变换,而Highway Network则允许保留之前网络层的一定比例的输出。ResNet的思想和Highway Network的思想也非常类似,允许原始输入信息直接传到后面的层中,如下图所示。

  

    这样的话这一层的神经网络可以不用学习整个的输出,而是学习上一个网络输出的残差,因此ResNet又叫做残差网络。

2、ResNet怎么解决网络退化?

 

     残差学习的结构如图有点类似与电路中的“短路”,所以是一种短路连接(shortcut connection)。增加一个identity mapping(恒等映射),将原始所需要学的函数H(x)转换成F(x)+x,F(x)的优化 会比H(x)简单的多。

Residual block通过shortcut connection实现,通过shortcut将这个block的输入和输出进行一个element-wise的加叠,这个简单的加法并不会给网络增加额外的参数和计算量,同时却可以大大增加模型的训练速度、提高训练效果,并且当模型的层数加深时,这个简单的结构能够很好的解决退化问题。

 

  上面公式中:

h 表示 shortcut 使用什么形式的变换(Identity map)
F 是 residual function。F= y-h(x)
f 为Residual Units输出处使用的函数(relu)

3、ResNet网络结构

输入部分、输出部分和中间卷积部分(四个stage),网络之间的不同主要在于中间卷积部分的block参数和个数存在差异。

 

  输入部分(conv1, bn1, relu, maxpool)

网络中间卷积部分

 Resnet18 、 50

ResNet34及ResNet101分别具有两种不同的基本“shortcut connection”结构。
ResNet34使用BasicBlock,ResNet101使用 Bottleneck作为“shortcut connection”。

“shortcut connection” 只是元素级相加操作

  

ResNet34

  downsample 主要用来处理H(x)=F(x)+x中F(x)和xchannel维度不匹配问题

 

残差块实现

图 : ResNet网络的短路连接机制(**其中+代表的是元素级相加操作**)

   由bootlenect和直线shortcut组成。整个bootlenect+shortcut称为Residual uint。几个Residual uint的叠加称为Residual block。Resnet结构都是由4个Residual block组成的。

ResNet34使用BasicBlock,ResNet101使用 Bottleneck作为“bootlenect”,引入1×1卷积

  

 - 1x1卷积作用?

- 对通道数进行升维和降维(跨通道信息整合)
- 比其他尺寸的运算复杂度低
- 引入了更多的非线性映射(relu)

 

  - downsample,它的作用是对输入特征图大小进行减半处理,每个stage都有且只有一个downsample。

网络输出部分

  全局自适应平滑池化,把所有的特征图拉成1*1,然后接全连接层输出,输出节点个数与预测类别个数一致。

设计规律

  • 卷积层主要是3×3卷积
  • 不使用dropout,全部使用BN
  • 对于相同的输出特征图大小的层,即同一stage,具有相同数量的3x3滤波器;
  • 当feature map大小降低一半时,feature map的数量增加一倍,这保持了网络层的复杂度。
  • 每个stage通过步长为2的卷积层执行下采样(downsample),而却这个下采样只会在每一个stage的第一个卷积完成,有且仅有一次。
  • 网络以全局平均池化层和softmax的1000路全连接层结束。

4、ResNet常见改进

  改进downsample部分,减少信息流失。每个stage的第一个conv都有下采样的步骤。

  • ResNet-B的改进就是就是将下采样移到后面的3x3卷积里面去做,避免了信息的大量流失。
  • ResNet-D则是在ResNet-B的基础上将identity部分的下采样交给avgpool去做,避免出现1x1卷积和stride同时出现造成信息流失。

 

 ResNet V2

 

 - a:相加后需要进入ReLU做一个非线性激活再输出,使残差块输出永远是非负的,制约了模型的表达能力

- e:a中输出处ReLU移入残差块内部

  然后我们来分析fff为恒等映射的重要性和相关设置。在原始残差模块中,FFF和h相加之后经过一个relu再输到下一个block,我们有那么几种做法来去掉relu操作来保持f的identity mapping,第一个就是把relu放回参数层F中,如上图中的©,但这样会让F中拟合的对于x的残差只有正值,会大大减小残差的表示性。

  文章提出了一种叫pre-activation的方式,即把BN和relu放在卷积的前面,这样就可以保证F中所有的操作都在和x相加之前完成,并且不会对残差产生限制,上图中的(e)。实际上把激活层(relu+BN)放在卷积的前面的操作在VGG等网络中不会产生不同的影响,但是在残差网络中就可以保证输入和输出加和之后在输入下一层之前没有别的操作,让整个信息的前向后向流动没有任何阻碍,从而让模型的优化更加简单和方便。

  对于(d)这种只把relu提前的操作也会产生问题,当F中经过最后一个BN后,还要经过一个和x相加的运算,本来BN就是为了给数据一个固定的分布,一旦经过别的操作就会改变数据的分布,会削减BN的作用。在原版本的resnet中就是这么使用的BN,所以这种pre-activation的方式也增加了残差模块的正则化作用。

6、Resnet深度

单个模型

  在ImageNet的精度152层的ResNet相比于其他网络有提高了一些精度,并且ResNet的参数量为1.1千万,VGG16参数数量为1.53千万,可见虽然ResNet深度增加了近十倍,但是参数量因为使用bottleneck模块反而更少。

From 100 to 1000 layers

  接着上面的ResNet想,可以说ResNet的成功是借助于residual模块的引入很好的解决了网络degradation的问题,从而提高了网络深度,得到了表达能力更强的特征,有了更高的准确度。那么我们还能不能加深一些呢?100层可以,1000层呢?
答案是不可以,至少目前的残差模型是不行的,因为目前的残差块在加和之后会经过一个relu,这增加的操作虽然在100层中不会有很大的影响,但是在1000层的超深网络里面还是会阻碍整个网络的前向反响传播,我们需要接着改进。
 

3.other residual module

More wild residual

  残差网络主要是研究深度对于网络的性能影响,并且在增加深度的同时为了减少计算量尽量让模型变瘦,用了bottleneck模块等技巧让每层的卷积核数量尽量少,但模型的深度到达一定程度之后,参数尽管大幅上升,但是不能带来相对应的性能的大幅提升,于是《Wide Residual Networks》这篇论文分析研究了宽度(每层卷积核数量)对于残差网络的影响,并用16层的改进残差网络就达到了1000层残差网络的性能,尽管提高了参数的数量,却需要更短的训练时间。

   上图是文章中实验的4种残差模型,(d)是文章中提出,可以看到相比于基础模块在中间加上了dropout层,这是因为增加了宽度后参数的数量会显著增加,为了防止过拟合使用了卷积层中的dropout,并取得了相比于不用dropout更好的效果。

 

   文章通过实验发现每个残差内部由两个33卷积层组成可以有最好的效果,上图是改进后模型的基本架构,沿用了原是残差模型中model–>block—>residual的形式,唯一不同的知识多了一个k的参数,代表了原始模块中卷积核数量的k倍,B(3,3)代表每一个残差模块内由两个33的卷积层组成。

  上图是不同宽度的模型之间纵向比较,同深度下,随着宽度增加,准确率增加。深度为22层,宽度为原始8倍的模型比深度为40层的同宽的模型准确率还要高。我们可以得到如下结论

  • 1.增大宽度可以增加各种深度的残差模型的性能
  • 2.只要参数的数量可以接受,宽度和深度的增加就可以使性能提升。
  • 3.在相同的参数数量下,更深的模型并不比更宽的模型有更好的性能。

  

  上图是164层原始残差网络和28层十倍宽度残差网络的比较,可以看到,改进后的宽网络有更低的错误率。这也证明了残差模型的性能提升主要在残差模块的残差部分上,而不是恒等映射部分。

Inception v4

  • GoogLeNet的Inception模块是很好的增加单层特征表达性能的方式,因此Inception和Residual二者就很好的结合了,具体细节在《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》中。主要思想为利用残差模块来帮助提升深度和加速训练,同时保持Inception的多分支卷积的形式来帮助增加前向过程的特征表达能力。
  • 值的注意的是作者在Inceptionv4论文中共提出了3个新的网络:Inceptionv4,Inception-ResNetv1,Inception_ResNetv2,并拿这三个网络加上Inceptionv3一起进行比较。

具体形式如下:

  

  

如上面的图片所示,改进主要有两点。1:将ressidual模块加入inception,2:将各分支的输出通过聚合后通过同一个1*1的卷积层来进行通道的扩增。

 

 从上图可以看出,加了Residual模块的模型训练速度明显比正常的Inception模型快一些,而且也有稍微高一些的准确率。

最后集合模型的Top-5准确率达到了3.1%

ResneXt

  wide residual研究了宽度对于残差网络的重要性,并提出了网络性能提升的关键在于残差模块,而不是shortcut,ResNeXt基于wide residual和inception,提出了另一个方向,即将残差模块中的所有通道分组进行汇合操作会有更好的效果,同时也给inception提出了一个抽象化的表示方式。

  简化的inception

 将Inception的不同尺寸的卷积核和池化等归一化为3*3的卷积核,并且每个分支都用1 * 1的卷积核去扩展通道后相加就得到了上面的结构,再这个基础上加上shortcut就得到了ResneXt模块:

 

 1.相对于Inception-Resnet,ResNeXt的每个分支都是相同的结构,相对于Inception,网络架构更加简洁。

2.Inception-Resnet中的先各分支输出concat然后1 * 1卷积变换深度的方式被先变换通道数后单位加的形式替代。

3.因为每个分支的相同结构,可以提出除了深度和宽度之外的第三维度cardinality,即分支的数量

   上图是ResNeXt的配置图,可以类比Wide Residual的配置图,二者一个是改变了卷积核的倍数,一个增加了分组,但都是在残差模块做工作。

 

   可以看到,相对于100层的残差网络,用深度,宽度,和cardinality三种方式增大了两倍的复杂度,相同复杂度下,分组更多即C更大的模型性能更好,这说明cardinality是一个比深度和宽度更加有效的维度。

posted @ 2020-01-08 21:06  大海在倾听  阅读(9212)  评论(0编辑  收藏  举报