一、ResNet
resnet在2015年的ImageNet大规模视觉识别竞赛(ImageNet Large Scale Visual Recognition Challenge, ILSVRC)中获得了图像分类和物体识别的优胜。
残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。因此之后很多方法都建立在ResNet50或者ResNet101的基础上完成的。
二、残差模块
提出背景:对于许多视觉识别任务而言,表示的深度是至关重要的。但是发现随着网络深度的增加,准确率达到饱和然后迅速下降。而且这种退化不是由过拟合引起的,并且在适当的深度模型上添加更多的层会导致更高的训练误差。如下图所示:
残差模块:为了解决加深网络的情况下解决梯度消失问题引入了残差模块,对于每层的输入x,学习形成残差函数F(x) = H(x) - x, 而不是学习一些没有x的函数。如果网络已经到达最优,继续加深网络,residual mapping将被push为0,只剩下identity mapping,这样理论上网络一直处于最优状态了,网络的性能也就不会随着深度增加而降低了。
如图所示残差网络提出两种结构:一种是identity mapping(恒等映射层),一种是residual mapping。将x输入最后输出F(x)+x。
identity mapping:把当前输出直接传输给下一层网络(全部是1:1传输,不增加额外的参数),相当于走了一个捷径,跳过了本层运算,同时在后向传播过程中,也是将下一层网络的梯度直接传递给上一层网络,这样就解决了深层网络的梯度消失问题。(F(x) = 0)
residual mapping:F(x)=H(x)-x
论文中的两种残差网络:building block
这两种结构分别针对ResNet34(左图)和ResNet50/101/152(右图),一般称整个结构为一个”building block"(左图BasicBlock、右图BottleNeck)。其中右图,目的一目了然,就是为了降低参数的数目。看右图,输入是一个3×3×256的特征,第一个步骤用64个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复到256个channel,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话参考左图,输入假设是3x3x256,第一步经过256个卷积核3×3×256,第二部再经过256个卷积核3×3×256。所以参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。
三、结构分析
下图是VGG19、加深为34层网络、加深为34层网络并使用building block扩展结构:
右图的building block当输入和输出具有相同的维度时(实线快捷连接)时,可以直接使用恒等快捷连接(identity mapping)。当维度增加(虚线快捷连接)时,我们考虑两个选项:一是快捷连接仍然执行恒等映射,额外填充零输入以增加维度(此选项不会引入额外的参数);二是将快捷连接通过1*1卷积进行匹配维度。
如图是Resnet不同的结构,上表一共提出了5中深度的ResNet,分别是18,34,50,101和152,首先看表的最左侧,我们发现所有的网络都分成5部分,分别是:conv1,conv2_x,conv3_x,conv4_x,conv5_x,重点介绍resnet50和resnet101(后面代表卷积和全连接层数)。
[50层计算:conv1一个7*7*64,conv2三个building block,conv3四个building block,conv4六个building block,conv5三个building block,FC。一共1+3*3+4*3+6*3+3*3+1=50]
四、代码实现
https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py#L248
参考:
https://blog.csdn.net/yaochunchu/article/details/95527188