ResNet的一些个人理解

最开始接触到这个ResNet的时候是在看deeplab2的论文的时候,里面用到的是Res101,对于习惯了使用VGG16来作为基本框架的我对于这个101层的网络自然是充满着无比的敬意呀,哈哈。

ResNet在各个方面的表现都很优异,他的作者何凯明博士也因此摘得CVPR2016最佳论文奖。

我认为VGG16是在AlexNet的基础上加深了网络层次从而获得了优异的结果,就理论上来说,ResNet有100多层,性能上的优越是理所当然的;如果以后在慢慢加深网络的层次,来个3,5000层的网络,是不是就会有更好地结果呢?

那当然不是啦,

这其中牵扯到一个随着深度的增加,存在着梯度消失或者爆炸,所以深度学习模型很难训练。现在虽然已经存在一些技术手段如BatchNorm来缓解这个问题,但是还是不能避免神经网络退化的问题(Degradation problem)的出现。神经网络深度不断增加时,准确度出现饱和,甚至出现下降。

这个问题可以很清楚的在图中观察到。

我们从这个残差网络名字来入手( RESidual NETwork  ) , 

我们假设我们必须要使用一个300层的网络,我们已经知道了在如此深的这样的一个网络结构中是一定会出现我们上面所说的退化问题的,并且详细的知道了这“滑坡式”精度下降的出现是在第50层, 那么我们要如何来解决这个问题呢?

呃。。。。你们的想法是什么呢?

我们还是来看一下何博士的想法:既然50层之后会是精度下降的情况,那我们就让这些增加的层什么也不学习,仅仅维持以前的特性,这样一来,我们的网络只是在“原地打转”,并没有进一步的优化。但是对于我们假设的情况,这样就已经足够好了。

我们直接来看残差网络的核心思想,

我们来看这个网络,X作为网络的输入,我们假设得到的输出为H(x),简单来说,我们一小部分带来了H(x) - x 的提升,残差网络的中心思想就是要学习到这部分,我们把这部分表示为F(x),(F(x) = H(x) - x);这样,我们的输出就可以表示为F(x)+X 。 

当出现神经网络退化问题的时候,我们就不走这条路了,直接跳到右侧(有点类似于短路),不学习这部分的内容自然就不会退化了。。。。。

这部分参考自

https://blog.csdn.net/u011501388/article/details/80389164

https://www.jianshu.com/p/243ee5803837

https://blog.csdn.net/u011304078/article/details/80683985

我们来看一下ResNet的两种结构,

左侧的是ResNet34结构,ResNet50/101/152结构,我们一般将这种结构称之为' building block ',

特别的,右侧的这种结构也称之为bottle neck ,什么是bottle neck ? 这种结构设计的初衷是什么呢?

我们从名字来入手,我们很容易从图中看出它为什么叫做‘瓶颈结构’,就是两侧窄,中间宽嘛。

我们来看一下这段的描述

The three layers are 1X1, 3X3, and 1X1 convolutions,
 where the 1X1 layers are responsible for reducing and then increasing(restoring) dimensions, 
leaving the 3X3 layer a bottleneck with smaller input/output dimensions.

也就是说这两个1x1的卷积是用来减小和复原。

为什么要这么设计呢?然后找到一篇论文https://pdfs.semanticscholar.org/de8d/30f9c59be0c235ae2de7da77993e54f9f91f.pdf?_ga=2.123500427.1832799503.1538275568-288142727.1538275568

没看完,就看了一小段对于Bottleneck设计的描述,其中有这么一句话:

Bottleneck features are most commonly used in an autoencoder which the neural network is trained to predict the input features themselves.

大概的意思就就是这部分的结构是用来做autoencoder

https://blog.csdn.net/marsjhao/article/details/73480859

en....大家可以自行参考。

粗略的总结一下

这样做的一个目的是为了降低参数的数目:

第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632;

不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。 

另一个目的应该是:

可以对单元进行降维的特征学习,通过Bottleneck将输入的特征进行降维后的残差学习。

猜你喜欢

转载自blog.csdn.net/Pierce_KK/article/details/84955413
今日推荐