产生背景
网络的层数越多,就能够提取更多的特征,但是如果只是简单的增加深度,就会导致梯度爆炸。也有文章提出,解决该问题的方法是正则化初始化和中间的正则化层,但是这样会导致另一个问题,退化,网络的层数增加,但是在训练集上的准确率达到饱和之后开始下降,导致深度网络不能被很好的优化。
意义
作者根据输入将层表示为学习残差函数。实验表明,残差网络更容易优化,并且能够通过增加相当的深度来提高准确率。核心是解决了增加深度带来的副作用(退化问题),这样能够通过单纯地增加网络深度,来提高网络性能。
resnet的网络结构
如果我们把一个网络的输出定义为 H ,残差定义为 H-x ,那么,ResNet其实就是在学习这个残差 F=H-x ,通过将残差最小化,来学习模型。而且,在CNN中,输出的维度可以与输入维度不一样,比如池化层、或者卷积核的strides设为2,这就会导致输出 F 与输入 x 的维度不一样,这个时候就不能直接把 F,x 直接相加了,针对这种情况,ResNet作者建议可以用 1 * 1 的卷积层,stride=2,就是采用下图中的右边模块 ,从而与 F 维度匹配起来,再进行相加。
下图是ResNet中使用的两种残差单元:一种是以两个33的卷积网络串接在一起作为一个残差模块,另外一种是11、33、11的3个卷积网络串接在一起作为一个残差模块。(也就是实现与虚线的区别)
resnet的结构图:
不同深度的resnet:
输出结果
从下图可以看出残差网络能够在深度增加的情况下,维持较高的准确率的增长,有效地避免了VGG网络中层数增加到一定程度,模型准确度不升反降的问题
时间有限,以后再补充一些细节。
代码实现部分参考链接:
https://github.com/tensorflow/models/blob/master/research/slim/nets/resnet_v2.py