zoukankan      html  css  js  c++  java
  • RESNET 网络结构

    ResNet结构

    它使用了一种连接方式叫做“shortcut connection”,顾名思义,shortcut就是“抄近道”的意思,看下图我们就能大致理解:

    图1 Shortcut Connection

            这是文章里面的图,我们可以看到一个“弯弯的弧线“这个就是所谓的”shortcut connection“,也是文中提到identity mapping,这张图也诠释了ResNet的真谛,当然大家可以放心,真正在使用的ResNet模块并不是这么单一,文章中就提出了两种方式:

    图2 两种ResNet设计

            这两种结构分别针对ResNet34(左图)和ResNet50/101/152(右图),一般称整个结构为一个”building block“。其中右图又称为”bottleneck design”,目的一目了然,就是为了降低参数的数目。看右图,输入是一个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倍。

            对于常规ResNet,可以用于34层或者更少的网络中,对于Bottleneck Design的ResNet通常用于更深的如101这样的网络中,目的是减少计算和参数量(实用目的)。

     

            如图1所示,如果F(x)和x的channel个数不同怎么办,因为F(x)和x是按照channel维度相加的,channel不同怎么相加呢?

            针对channel个数是否相同,要分成两种情况考虑,如下图:

    图3 两种Shortcut Connection方式

            如图3所示,我们可以清楚的”实线“和”虚线“两种连接方式,实线的的Connection部分(”第一个粉色矩形和第三个粉色矩形“)都是执行3x3x64的卷积,他们的channel个数一致,所以采用计算方式: y=F(x)+x

           虚线的的Connection部分(”第一个绿色矩形和第三个绿色矩形“)分别是3x3x64和3x3x128的卷积操作,他们的channel个数不同(64和128),所以采用计算方式:

    y=F(x)+W·x   其中W是卷积操作,用来调整x的channel维度的;

    3.ResNet50和ResNet101

            这里把ResNet50和ResNet101特别提出,主要因为它们的出镜率很高,所以需要做特别的说明。给出了它们具体的结构:

    表2,Resnet不同的结构

            首先我们看一下表2,上面一共提出了5中深度的ResNet,分别是18,34,50,101和152,首先看表2最左侧,我们发现所有的网络都分成5部分,分别是:conv1,conv2_x,conv3_x,conv4_x,conv5_x,之后的其他论文也会专门用这个称呼指代ResNet50或者101的每部分。

            拿101-layer那列,我们先看看101-layer是不是真的是101层网络,首先有个输入7x7x64的卷积,然后经过3 + 4 + 23 + 3 = 33个building block,每个block为3层,所以有33 x 3 = 99层,最后有个fc层(用于分类),所以1 + 99 + 1 = 101层,确实有101层网络;

            注:101层网络仅仅指卷积或者全连接层,而激活层或者Pooling层并没有计算在内; 这里我们关注50-layer和101-layer这两列,可以发现,它们唯一的不同在于conv4_x,ResNet50有6个block,而ResNet101有23个block,查了17个block,也就是17 x 3 = 51层。

    4.基于ResNet101的Faster RCNN

    文章中把ResNet101应用在Faster RCNN上取得了更好的结果,结果如下:

    表3,Resnet101 Faster RCNN在Pascal VOC07/12 以及COCO上的结果

    这里有个问题:

            Faster RCNN中RPN和Fast RCNN的共享特征图用的是conv5_x的输出么?

            针对这个问题我们看看实际的基于ResNet101的Faster RCNN的结构图:

    图5 基于ResNet101的Faster RCNN

            图5展示了整个Faster RCNN的架构,其中蓝色的部分为ResNet101,可以发现conv4_x的最后的输出为RPN和RoI Pooling共享的部分,而conv5_x(共9层网络)都作用于RoI Pooling之后的一堆特征图(14 x 14 x 1024),特征图的大小维度也刚好符合原本的ResNet101中conv5_x的输入;

            最后一定要记得最后要接一个average pooling,得到2048维特征,分别用于分类和框回归。

    5.到底哪种是ResNet的结构?

            ResNet残差网络,想必大家一定很熟悉了,那么先考考大家,下面(1)-(5)的结构哪个是我们常用的ResNet结构?

            其中weight指conv层,BN指Batch Normalization层,ReLU指激活层,addition指相加;根据ResNet的描述,似乎以上五组都符合,那么2016年ResNet原文是哪一个结构呢?以及其他四组结构也都work么?我们不禁有了这两个疑问,伴随着疑问我们一一揭开谜题;

            针对第一个问题,ResNet原文中使用的结构是(1)。

         (1)的特点有两个:1)BN和ReLU在weight的后面;2)最后的ReLU在addition的后面;

           对于特点1),属于常规范畴,我们平时也都这个顺序:Conv->BN->ReLU;

           对于特点2),为什么ReLU放在addition后面呢?按照常规,不是应该是图(3)这种么,那么我们接下来引出的问题就是:

             图(3)的结构work么?

            对于每个图右侧部分我们称作“residual”分支,左侧部分我们称作“identity”分支,如果ReLU作为“residual”分支的结尾,我们不难发现“residual”分支的结果永远非负,这样前向的时候输入会单调递增,从而会影响特征的表达能力,所以我们希望“residual”分支的结果应该在(-∞, +∞);这点也是我们以后设计网络时所要注意的。

            对于图(3)不OK的情况,那如果把BN也挪到addition后面呢?如图(2),同时也保证了“residual”分支的取值范围?

           这里BN改变了“identity”分支的分布,影响了信息的传递,在训练的时候会阻碍loss的下降;这里大家肯定又有个问题:

    为什么“identity”分支发生变化,会影响信息传递,从而影响训练呢?

    这里简单回顾ResNet的公式:

    在分析图(4)和图(5)之前,我们引出一个概念:”Post-activation”激活之后和”Pre-activation”激活之前,其中Post和Pre的概念是相对于weight(conv)层来说的,那么我们不难发现,图(1), (2), (3)都是”Post-activation”,图(4), (5)都是”Pre-activation”,那么两种模式哪一个更好呢?这里我们就用实验结果说话。

    上图是5种结构在Cifar10上的实验结果,一共实验了两种网络ResNet110和ResNet164。

    从实验结果上,我们可以发现图(4)的结构与ResNet原结构伯仲之间,稍稍逊色,然而图(5)的结构却好于ResNet原结构。图5的结构好的原因在于两点:1)反向传播基本符合假设,信息传递无阻碍;2)BN层作为pre-activation,起到了正则化的作用;

    最后我们通常把图5的结构称作ResNetV2,这里我们给出ResNetV1和ResNetV2结构:

    参考文章:

    https://blog.csdn.net/lanran2/article/details/79057994

    https://blog.csdn.net/lanran2/article/details/80247515

  • 相关阅读:
    复制带中文的公式贴到通达信公式中显示乱码解决方案
    命令指定线程个数
    随机姓名
    将二维list某列组成新的list
    jenkins配置小结
    jmeter5.0 while controller使用总结
    centos7 桌面化配置
    django study1 数据库
    centos7 安装firefox
    python之self
  • 原文地址:https://www.cnblogs.com/lyp1010/p/13952208.html
Copyright © 2011-2022 走看看