美文网首页
Resnet原理

Resnet原理

作者: 不分享的知识毫无意义 | 来源:发表于2020-01-21 15:15 被阅读0次

0 前言

Resnet一般用于图像分类问题,它是一种残差网络,其实是从VGG发展而来,可以解决传统网络深度加深而出现的损失增加问题,其实本质也是CNN的一种变种。为什么叫残差网络呢,我们来看下图:


残差网络一个模块

假设有输入X,这是个张量,三维四维都有可能的,经过某一层网络后有一个输出H(X),神经网络的训练过程就是要学习这个H(x)。
但是从残差网络的图我们可以看出来,残差网络多了一个identity mapping过程,名字起得还挺好,其实就是把这一层的输入不做任何处理直接加到这层网络的输出上。当然经过卷积层的输入输出维度可能有变化,他自己有个采样方法,可以保证维度一致的。方法有两种:直接补0或者采用1×1卷积。
这样的话残差网络实际上学习的是H(X)-X,这也是它名字的来源。

1.Resnet原理

这里我们关注它是怎么具体实现的。

1.1关键组成

  • residual block/bottleneck模块
    残差网络是由一个个residual block构成的,但为了计算方便,Resnet的作者提出来了bottleenck模块。


    Resnet模块示意图

    上面这个图呢,左边就是传统的连接方式,通过两个卷积网络,得到最后的输出,然后再加上残差。这样做的缺点就是参数太多了,在网络很深的时候,计算量就变大了,于是有人提出了bottleneck,可以有效减少参数量。
    bottleneck包括两个1×1的卷积核,关于这个卷积核的作用,有以下几种说法:
    (1)升维和降维,比如64的最后成功映射到256
    (2)增加非线性,使网络拟合效果更好
    (3)减少计算量

  • BN模块
    BN是Batch Normalization,在进行深度网络的构建的时候一般都会用到这一个模块,主要是在梯度下降算法过程中,我们要花很多时间去调参,比如学习率,dropout比率等等。相比之下,BN就好多了:
    (1)最好的一点,可以不要dropout和L2正则
    (2)可以选择一个较大的学习率,使训练很快收敛
    这一层的目的是对数据做一个标准化的处理,可能会改变数据原有的分布情况。比如说上一层学完的数据大部分都大于0,经过Relu这层函数之后,大于0的被激活,强制来个归一化,可能会影响数据的激活效果。这个时候,有人提出了可学习的参数:


    归一化方法
  • Relu模块
    Relu就是0-1激活层。
    通过以上几个模块的摆放我们就能得到不同结构的Resnet。

1.2 常见Resnet的结构

下面这个图是VGG19、34层深度神经网络还有34层残差网络的一个结构图。可以看出来Resnet的深度是加深了,但是由于加上了残差项,很好地避免了梯度消失和网络失效的问题。那个实线就是输入和残差直接相加,因为维度是一样的,虚线就是把维度处理以后再相加。


Resnet和其他网络的比较

我觉得理解起来还是没有什么难度的,不知道大家觉得怎么样。根据层数的不同Resnet可以分为18、34、50、101、152几种。


常用Resnet的构成对比
不难发现吧,超过50层的都用了bottleneck结构。具体的不多说了,自己看吧。

1.2 不同残差块的组成情况

传统的残差网络一个模块是下面这个图这样的,输入进来以后卷积,BN标准化,再激活,再卷积再BN标准化,然后和原始输入加起来以后,再做一次激活。


残差网络的一个模块

这里有很多激活函数不同位置的案例,但是大家做的时候,就先照着标准的来就行了。


激活函数位置

相关文章

网友评论

      本文标题:Resnet原理

      本文链接:https://www.haomeiwen.com/subject/byyjzctx.html