ResNet

完整代码:ResNet实现完整代码

ResNet

ResNet是2015年何恺明推出的,在ISLVRC和COCO上横扫所有选手,获得冠军。
论文:Deep Residual Learning for Image Recognition

AlexNet (7层) 到VGGNet (16–>19层) 再到GoogLeNet (22层),似乎是网络越深 (复杂,参数多) ,表征能力越强。但实验表明,随着网络加深,优化效果反而越差,测试和训练数据的准确率反而降低。这里涉及两个臭名昭著的问题:网络的加深会造成梯度爆炸梯度消失。然而,这两个问题通过对输入和中间层进行归一化,可以保证几十层的网络在反向传播中采用随机梯度下降(SGD)从而让网络收敛。
当更深的网络开始收敛时,一个退化问题暴露出来:随着网络深度的增加,准确率(Accuracy)变得饱和(这可能不足为奇),然后迅速退化。 出乎意料的是,这种退化并不是由过拟合引起的,在适当的深度模型中添加更多的层会导致更高的训练误差。如下图Figure.1所示,56层的网络训练误差比20层的还要高。
ResNet_第1张图片
为解决这种退化问题,何凯明等人提出深度残差学习网络。先看一下残差结构图(Figure.2):
ResNet_第2张图片
假设传统网络层(Figure.2中包含2层weight layer)是一个映射函数 F ( x ) F(x) F(x) , 其输出结果表示为 H ( x ) H(x) H(x),即 H ( x ) = F ( x ) H(x) = F(x) H(x)=F(x)。在残差结构中, H ( x ) H(x) H(x) 表示为 H ( x ) = F ( x ) + x H(x) = F(x)+x H(x)=F(x)+x
下面说一下我对 H ( x ) = F ( x ) + x H(x) = F(x)+x H(x)=F(x)+x 的理解。
假设深度网络已经达到一定的深度并达到最优状态,即此时的 x x x 是最优表示。如果此时网络没有 identity x x x (同等映射),则网络再经过 F ( x ) F(x) F(x) 变换,训练误差会增大,即 F ( x ) F(x) F(x) 的参数会再次调整,但这次是朝着坏的方向变化。
如果将最优表示 x x x 通过跳跃连接(skip connection 或者 shortcut connection),得到 F ( x ) + x F(x)+x F(x)+x ,则再优化 F ( x ) + x F(x)+x F(x)+x 时,网络最差也会是最优表示 x x x 的状态,如果 F ( x ) F(x) F(x) 朝着好的方向再优化一些参数,其结果就变的更好,这样不仅加深了网络深度,也使网络有更大几率朝着更好的方向优化。
另一更加通俗的理解:将低层学习到的 x x x 表示通过跳跃连接传递到高层,进一步强化高层对低层信息的理解,从而构建更深的网络。

Bottleneck结构

为了实际计算的考虑,提出了一种Bottleneck的结构块来代替常规的残差块,ResNet像Inception网络那样通过使用(1,1)卷积来巧妙地缩减或扩张feature map维度从而使得(3,3)卷积层的卷积核数上一层输入的影响,自然它的输出也不会影响到下一层。
如下图所示:
ResNet_第3张图片

ResNet构建

为了表明残差网络的有效性,何凯明等人共使用了三种网络进行实验。其一为VGG19网络(这是VGGNet中最深的亦是最有效的一种网络结构),另外则是顺着VGGNet网络思维继续加深其层次而形成的一种VGGNet朴素网络,它共有34层。最后则是与上述34层朴素网络相对应的ResNet网络。
具体实现残差网络时,如果残差映射 ( F ( x ) F(x) F(x) ) 的结果的维度与跳跃连接 ( x x x) 的维度不同,是没有办法对它们两个进行相加操作的,必须对 x x x 进行升维操作才能计算。
ResNet连接方式是通过元素级相加。
升维的方法有两种:

  1. 全0填充;
  2. 采用1*1卷积。
    三种网络结构如下图所示:

    实验结果如下图:
    ResNet_第4张图片

ResNet的优缺点:

  1. 引入了全新的网络结构(残差学习模块),形成了新的网络结构,可以使网络尽可能地加深;
  2. 使得前馈/反馈传播算法能够顺利进行,结构更加简单;
  3. 恒等映射地增加基本上不会降低网络的性能;
  4. 建设性地解决了网络训练的越深,误差升高,梯度消失越明显的问题;
  5. 由于ResNet搭建的层数众多,所以需要的训练时间也比平常网络要长。

ResNet V2

简单看一下 ResNet V2:
v1版本残差块可由公式表述如下:
在这里插入图片描述
h ( x ) = x h(x)=x h(x)=x 是一个恒等映射; F F F 是残差函数; f f f 是ReLU激活函数。
V2版本主要工作是构建了信息传播的直接通道——不仅是在残差块内部,而且在整个网络中都能够高效地传递。作者通过推导证明了:如果 h ( x ) h(x) h(x) f ( x ) f(x) f(x) 都是恒等映射的话,那么信号能够直接从一个残差块传递到另一个残差块,无论是在前向传播还是反向传播的过程中。
ResNet_第5张图片
如上图所示,左图是v1中使用的残差块结构示意图,右图是V2使用的结构。与v1版本相比,v2将激活函数都放在了残差支路上,这样一来,在反向传播和前向传播中,信息的传播速度都会很快,这使得网络能够得到更好的效果,并且这种结构也防止了梯度消失的问题。

你可能感兴趣的:(ResNet,keras,深度学习,神经网络)