ResNet网络解析和代码实现

ResNet网络解析和代码实现ResNet(Residual Neural Network)在2015年由Kaiming He等人提出的,通过特殊的网络结构设计,训练出了152层的深度神经网络,并在ImageNet比赛classification任务上获得了冠军(top-5错误率 3.57%)。ResNet的提出打破了深度网络无法训练的难题,不仅模型的准确率得到提高,而且参数量也比VGG少,之...
摘要由CSDN通过智能技术生成

ResNet网络解析和代码实现

ResNet(Residual Neural Network)在2015年由Kaiming He等人提出的,通过特殊的网络结构设计,训练出了152层的深度神经网络,并在ImageNet比赛classification任务上获得了冠军(top-5错误率 3.57%)。ResNet的提出打破了深度网络无法训练的难题,不仅模型的准确率得到提高,而且参数量也比VGG少,之后也有很多网络的设计都借鉴了ResNet的思想,如Google InceptionV4,DenseNet等,使网络性能得到进一步的提升。

1.背景与灵感

1)通常认为神经网络的深度对网络的性能影响很大,越深的网络往往能得到更好的性能,但随着网络的加深,由于存在信息损失严重和梯度消失等问题,训练难度也加大。
2)在不断加深网络的深度时,会出现Degradation的问题,即准确率会先上升,然后逐渐饱和,继续加深可能会导致准确率下降。这不是过拟合的问题,因为模型在训练集和测试集上的误差都会加大(通常产生过拟合是因为网络过分学习了训练集的特征而降低了其泛化能力,造成训练集的准确率很高,而测试集的准确率很低)。

ResNet提出的残差模块能解决以上的问题。既然网络加深到一定程度会造成饱和和准确率下降,那在特征传递的过程中,就让后续网络层的传递媒介影响降低,使用全等映射,将输入直接传递给输出,这样至少能保证网络性能不下降。
如上图所示,ResNet的残差学习模块在对特征进行传递的时候,提供了两条道路,一条是经过residual映射,得到F(x),另一条路则是直接传递x本身,合并之后再进行激活,传递到下一个模块。当网络已经达到最优,网络的后续训练将会限制residual映射部分,当residual被限制为0时,就只剩下全等映射的x,网络也就不会因为深度的加深造成准确率下降了。
假设期望的输出是H(x),则训练时F(x)=H(x)-x,其中x是有全等映射的支路传递过去的,而F(x)是有residual映射传递的,网络的训练将对F(x)部分的权重进行优化更新,学习的目标不再是完整的输出H(x),而是输出与输入的差别H(x)-x,F(x)即是所谓的残差。
由于ResNet使用了分支的方法,其中一条支路将上一层的输入直接传递到下一层,使得的信息得到了更多的保留,减轻了深层网络信息丢失和损耗的问题,这种结构成为shortcut或skip connections。

2.网络结构

这里写图片描述
在ILSVRC 2015比赛获胜的解决方案是深度为152层的方案,但另外两个方案50-layer和101-layer更经常被引用和借鉴。
网络由三大块组成。首先通过一个普通的卷积层[7x7x64],stride=2,对输入图片进行特征提取,并将尺寸缩小为原来的1/2,然后接上[3x3]的最大池化,stride=2,进一步缩小feature map的尺寸,然后就送入各个残差模块。论文中以类似于conv2_x的方式对网络进行命名(上表中的layer name),同一个Block中,如conv2_x中有多个残差模块连接。最后,网络使用全局池化进行规整,再使用softmax进行分类(ImageNet比赛分类任务有1000个分类)。

网络层数计算
以比赛获胜的152-layer方案为例,每个Block中残差模块的数量分别是3、8、36、3,而每个残差模块中都包含了3层卷积,故残差模块的总层数为(3+8+36+3)*3=150,再加上第一层的卷积和最后一层的分类,总共是152层,其他几个网络方案的计算类似(激活和池化不计算在内)。

3.残差模块
1)残差模块结构

这里写图片描述
论文中提出两种残差模块,其中左边的模块使用两个[3x3]的卷积核,右边的结构先用[1x1]卷积操作将通道数降维成64,在[3x3]卷积操作后再用[1x1]卷积将通道数升到256,经历了先降维再升维,这种结构称为bottleneck design,带来的好处是可以降低参数的数量。和Inception V3类似,ResNet在深度加深的同时不断使用步长为2的层来缩减feature map的空间尺寸,同时增加输出的通道数,最后达到2048。

2)尺寸匹配

上图的残差模块的输出中,y=F(X)+x,即经过residual映射的feature map和原输入的feature map x相加,运算可以执行的条件是这两部分的空间尺寸和channel数相同(这点与Inception网络不同,Inception在进行分支合并时是采用通道拼接的方式(tf.concat),只要保证空间尺寸相同即可)。

通道数不同: 如果两部分的通道数不同,则需要通过卷积操作调整x的channel数进行匹配,即y=F(X)+Wx,其中W为卷积操作。

空间尺寸不同: 若空间尺寸不同(因为残差模块中[3x3]的卷积层stride可能是2,即经过该residual变换后空间尺寸减小为原来的1/2),则需要对输入的x使用降采样(subsample),stride根据实际情况设置。

4.代码实现
1)bottleneck——残差模块

参数列表:
inputs 输入,depth 输出通道数,depth_bottleneck 残差的第1、2层输出通道数,stride 步长

def bottleneck(inputs, depth, depth_bottleneck, stride, outputs_collections = None, scope = None):
    
    with tf.variable_scope(scope, 'bottleneck_v2', [inputs]) as sc:
        depth_in = slim.utils.last_dimension(inputs.get_shape
  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值