大家好,欢迎来到IT知识分享网。
一说起“深度学习”,自然就联想到它非常显著的特点“深、深、深”(重要的事说三遍),通过很深层次的网络实现准确率非常高的图像识别、语音识别等能力。因此,我们自然很容易就想到:深的网络一般会比浅的网络效果好,如果要进一步地提升模型的准确率,最直接的方法就是把网络设计得越深越好,这样模型的准确率也就会越来越准确。
带着这个问题,我们先来看一个实验,对常规的网络(plain network,也称平原网络)直接堆叠很多层次,经对图像识别结果进行检验,训练集、测试集的误差结果如下图:
从上面两个图可以看出,在网络很深的时候(56层相比20层),模型效果却越来越差了(误差率越高),并不是网络越深越好。通过实验可以发现:随着网络层级的不断增加,模型精度不断得到提升,而当网络层级增加到一定的数目以后,训练精度和测试精度迅速下降,这说明当网络变得很深以后,深度网络就变得更加难以训练了。
1、为什么随着网络层级越深,模型效果却变差了呢?
从上面的过程可以看出,神经网络在反向传播过程中要不断地传播梯度,而当网络层数加深时,梯度在传播过程中会逐渐消失(假如采用Sigmoid函数,对于幅度为1的信号,每向后传递一层,梯度就衰减为原来的0.25,层数越多,衰减越厉害),导致无法对前面网络层的权重进行有效的调整。
那么,如何又能加深网络层数、又能解决梯度消失问题、又能提升模型精度呢?
2、深度残差网络(Deep Residual Network,简称DRN)
1、什么是残差(residual)?
“残差在数理统计中是指实际观察值与估计值(拟合值)之间的差。”“如果回归模型正确的话, 我们可以将残差看作误差的观测值。”准确地,假设我们想要找一个x,使得 f(x)=b,给定一个x的估计值 x0,残差就是 b−f(x0),同时,误差就是 x−x0。即使x不知道,我们仍然可以计算残差,只是不能计算误差罢了。
2. 残差网络(Residual Networks,ResNets)
残差网络通过加入 shortcut connections“跳跃连接”,变得更加容易被优化。包含一个 shortcut connection 的几层网络被称为一个残差块(residual block),如下图所示:
2.1 残差块(residual block)
如上图所示,x表示输入,F(x)表示残差块在第二层激活函数之前的输出,即,其中 W1和W2 表示第一层和第二层的权重,σ表示 ReLU 激活函数。(这里省略了 bias)最后残差块的输出是
当没有 shortcut connection(即右侧从 x 到⨁ 的箭头)时,残差块就是一个普通的 2 层网络。残差块中的网络可以是全连接层,也可以是卷积层。设第二层网络在激活函数之前的输出为 H(x)。如果在该 2 层网络中,最优的输出就是输入x,那么对于没有 shortcut connection 的网络,就需要将其优化成 H(x)=x;对于有 shortcut connection 的网络,即残差块,最优输出是 x,则只需要将 F(x)=H(x)−x 优化为 0 即可。后者的优化会比前者简单。这也是残差这一叫法的由来。
回想前面的假设,如果已经学习到较饱和的准确率(或者当发现下层的误差变大时),那么接下来的学习目标就转变为恒等映射的学习,也就是使输入x近似于输出H(x),以保持在后面的层次中不会造成精度下降。
在上图的残差网络结构图中,通过“shortcut connections(捷径连接)”的方式,直接把输入x传到输出作为初始结果,输出结果为H(x)=F(x)+x,当F(x)=0时,那么H(x)=x,也就是上面所提到的恒等映射。于是,ResNet相当于将学习目标改变了,不再是学习一个完整的输出,而是目标值H(X)和x的差值,也就是所谓的残差F(x) := H(x)-x,因此,后面的训练目标就是要将残差结果逼近于0,使到随着网络加深,准确率不下降。
实际上这条捷径是在进行ReLU非线性激活函数之前加上的,而这里的每一个节点都执行了线性函数和ReLU激活函数。所以插入的时机是在线性激活之后,ReLU激活之前。
这种残差跳跃式的结构,打破了传统的神经网络n-1层的输出只能给n层作为输入的惯例,使某一层的输出可以直接跨过几层作为后面某一层的输入,其意义在于为叠加多层网络而使得整个学习模型的错误率不降反升的难题提供了新的方向。至此,神经网络的层数可以超越之前的约束,达到几十层、上百层甚至千层,为高级语义特征提取和分类提供了可行性。
ResNet50和ResNet101
这里把ResNet50和ResNet101特别提出,主要因为它们的出镜率很高,所以需要做特别的说明。给出了它们具体的结构:
- 实线的Connection部分,表示通道相同,如上图的第一个矩形和第三个矩形,都是3x3x64的特征图,由于通道相同,所以采用计算方式为H(x)=F(x)+x
- 虚线的的Connection部分,表示通道不同,如上图的第三个矩形和第五个矩形,分别是3x3x64和3x3x128的特征图,通道不同,采用的计算方式为H(x)=F(x)+Wx,其中W是卷积操作,用来调整x维度的。
框架实现TensorFlow 版:ResNet model in TensorFlow:https://github.com/ry/tensorflow-resnet
ResNet-50, ResNet-101, and ResNet-152 代码及ILSVRC/COCO模型(Caffe):https://github.com/KaimingHe/deep-residual-networks
ResNet-1001代码及ILSVRC/COCO模型(Caffe-目前第一名): https://github.com/KaimingHe/resnet-1k-layers
基于ResNet101的Faster RCNN
其中蓝色的部分为ResNet101,可以发现conv4_x的最后的输出为RPN和RoI Pooling共享的部分,而conv5_x(共9层网络)都作用于RoI Pooling之后的一堆特征图(14 x 14 x 1024),特征图的大小维度也刚好符合原本的ResNet101中conv5_x的输入;
最后大家一定要记得最后要接一个average pooling,得到2048维特征,分别用于分类和框回归。
结语
- 建议仔细阅读下何凯明关于深度残差网络的两篇经典论文,深度残差网络的主要思想便是在这论文中提出来的,值得收藏阅读
- 《Deep Residual Learning for Image Recognition》译文地址:CNN经典模型:深度残差网络(DRN)ResNet
- 《Identity Mappings in Deep Residual Networks》译文地址:CNN经典模型:深度残差网络(DRN)ResNet
转载自:https://my.oschina.net/u//blog/
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/127591.html