ResNet残差网络

1 为什么要使用残差网络模型

非常非常深的神经网络是很难训练的,因为存在**梯度消失**和**梯度爆炸**问题。

ResNet残差网络_第1张图片

  • Plain Networks
    如果我们使用标准优化算法训练一个普通网络,比如说梯度下降法,或者其它热门的优化算法。如果没有残差,没有这些捷径或者跳跃连接,凭经验你会发现随着网络深度的加深,训练错误会先减少,然后增多。而理论上,随着网络深度的加深,应该训练得越来越好才对。也就是说,理论上网络深度越深越好。 但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练。实际上,随着网络深度的加深,训练错误会越来越多。(左图)
  • ResNet
    但有了ResNets就不一样了,即使网络再深,训练的表现却不错,比如说训练误差减少,就算是训练深达100层的网络也不例外。有人甚至在1000多层的神经网络中做过实验,尽管目前我还没有看到太多实际应用。但是对 的激活,或者这些中间的激活能够到达网络的更深层。这种方式确实有助于解决梯度消失和梯度爆炸问题,让我们在训练更深网络的同时,又能保证良好的性能。也许从另外一个角度来看,随着网络越来深,网络连接会变得臃肿,但是ResNet确实在训练深度网络方面非常有效。( 右图)

2 残差网络模型结构

2.1 核心组件结构

2.1.1宏观结构

在ResNet网络结构中会用到两种残差模块,一种是以两个3X3的卷积网络串接在一起作为一个残差模块,另外一种是1X1、3X3、1X1的3个卷积网络串接在一起作为一个残差模块。如下图所示。
ResNet残差网络_第2张图片

  • 左图

其中左图为最原始的残差网络模型结构,(卷积核shape:3X3X64X64—> 3X3X64X64)。

  • 右图

右图为改进后的模型结构,主要是利用Bootlenblock(1X1的卷积核)优化残差映射网络,即先从原始256通道数降到64通道数,经过3X3的卷积后保持64通道数不变,最后再经过1X1的卷积核把通道数从64升到256,主要是为了保持特征X与残差F(x)相加的通道数一致性,(卷积核shape:1X1X256X64—>3X3X64X64—>1X1X64X256)

2.1.2微观结构

ResNet残差网络_第3张图片

  • 前置激活与后置激活
    前置激活就是再卷积之前早BN和relu,反之则是在卷积之后做BN和relu,在模型的架构中前置激活和后置激活都会用,这需要看模型是如何设计的,我看到有一篇英文文献介绍了前置和后置激活对模型效果影响(英文文献 https://arxiv.org/pdf/1603.05027v2.pdf,中文文档 https://arxiv.org/pdf/1603.05027v2.pdf)
    ResNet残差网络_第4张图片
  • 批归一化(Batch Normalization)
    从字面意思看来Batch Normalization(简称BN)就是对每一批数据进行归一化,确实如此,对于训练中某一个batch的数据{x1,x2,…,xn},注意这个数据是可以输入也可以是网络中间的某一层输出。在BN出现之前,我们的归一化操作一般都在数据输入层,对输入的数据进行求均值以及求方差做归一化,但是BN的出现打破了这一个规定,我们可以在网络中任意一层进行归一化处理,因为我们现在所用的优化方法大多都是min-batch SGD,所以我们的归一化操作就成为Batch Normalization。
    BN是由Google于2015年提出,这是一个深度神经网络训练的技巧,它不仅可以加快了模型的收敛速度,而且更重要的是在一定程度缓解了深层网络中“梯度弥散”的问题,从而使得训练深层网络模型更加容易和稳定。所以目前BN已经成为几乎所有卷积神经网络的标配技巧了。
    ResNet残差网络_第5张图片BN具体操作细节请参考这篇博文:https://www.cnblogs.com/skyfsm/p/8453498.html

2.2 不同ResNet整体网络结构

ResNet有不同的网络层数,比较常用的是50-layer,101-layer,152-layer。他们都是由上述的残差模块堆叠在一起实现的。
ResNet残差网络_第6张图片

3 代码示例及数据集

可以参考tensorflow的官网 https://github.com/tensorflow/models/tree/master/research/resnet
个人博客 https://github.com/liyaguo6/ResNet-Model

我自己也把代码下载下来,研究了3天的时间,才看懂代码运行过程,模型框架脚本文件看的比较细,基本都是能看懂,以后也打算按照这个脚本模式编写深度学习模型,另外,还有很多细节的地方还是尚不能理解,主要时有的tensorflow API以现在所积累的知识没看懂。个人github链接

你可能感兴趣的:(机器学习,tensorflow,深度学习,深度学习)