Resnet详解

参考https://blog.csdn.net/u013709270/article/details/78838875

增加网络深度是提高网络精度的一个重要方式。从Lenet的7层到Googlenet的22层,网络深度越来越深。

理论上为了增加精度,提取更好的特征,网络的深度可以任意增加。然而由于梯度消失导致网络不收敛以及误差增大精度降低等问题,网络的深度增加到移一定程度便不宜再增加。采用BN归一化等方法可以解决梯度消失等问题带来的网络不收敛,使得网络深度增加数倍。但是怎么解决网络深度的增加带来的精度降低呢?精度的降低意味着深度网络 学习了更多的噪声(比如与类别无关的信息)、或者随着网络深度的增加丢失了更多的有用信息。

在理解resnet之前先提出一个问题,为什么网络越深精度反而降低了呢?

假设增加的那一层网络什么都不学,那么输入输出就是恒等变换了,精度至少不会降低。

那么怎么保证增加的这层网络至少是恒等变换呢?那就是输入x直接叠加到网络的输出f(x)上成为新的输出G(x)=F(x)+x,然后反向传递的时候让网络去学习二者之间的误差G(x)-x即F(x),,这样就能保证网络可以实现恒等变换即F(x)=0。当然如果F(x)不为0,能学习到有用的新的信息,那F(x)和x叠加起来作为下层的输入岂不是更好。这里的叠加是指featuremap对应元素相加,只有两者尺寸相同维度相同才能相加,尺寸不同需要设置strides,维度不同需要升维降维或者补0(比如两个55x55x1的featuremap,对应channel上的元素相加)。

一、残差结构

Resnet详解_第1张图片

误差的反向传递、梯度计算可以参考 https://blog.csdn.net/qq_40806289/article/details/85285023

二、网络结构

Resnet详解_第2张图片

上图是VGG-19、普通的34层网络、34层的resnet网络结构对比。

1、三者的关系是VGG19增加网络层数------>普通的34层网络+残差单元------>34层resnet

resnet是在VGG的基础上修改而来,1、resnet池化的时候采用stride=2的卷积核,feature map长宽大小降低一半的同时(池化),保证featuremap的数量增加一倍(保证了网络的复杂度)。2、卷积核的个数(也即卷积得到的featureap的个数,channel数)为64,128,256,512四种. 3、使用global average pool层替换全连接层。

2、resnet中的残差单元(shortcut)

残差单元即网络结构旁侧的实线和虚线联通,这些联通即代表将L层输入x叠加到L层输出f(x),作为L+1层的输入x+f(x)。

实线联通的上下层网络代featuremap数量(维度)没有发生变化(比如输入尺寸55x55x64经过3x3x64卷积核输出尺寸为55x55x64,这时输入和输出size一样可以直接相加),L层输入x维度不需变换,x+f(x)有两种方式

    (1)L层 输入不做变换恒等映射直接与L层输出叠加

    (2)L层输入通过1x1卷积核进行线性变化(不改变尺寸)得到的结果再与L层输出叠加

虚线联通的上下层网络featuremap数量(维度)增加了一倍,尺寸也减小1倍后(池化后),L层输入(55x55x64)与L层输出(27x27x128)不能直接叠加,需要增加L层输入x的维度,这时候有两种处理方法

    (1)L层输入(55x55x64)直接 补0变成55x55x128,然后再池化为27x27x128

    (2)利用1x1卷积核增加维度,(55x55x64)经过1x1卷积核得到55x55x128,再池化为27x27x128

3、在浅层网络中在两层网络间添加残差单元,深层网络在三层网络中添加残差单元。见下图:

Resnet详解_第3张图片

左边的是两层的残差单元。

右边是三层的残差单元,先使用1x1卷积核降维,经过一个3x3卷积核后再用1x1卷积核升维(bottleneck design,维度先降低再增加)。

 

 

 

 

 

 

 

你可能感兴趣的:(卷积网络,神经网络,算法)