前言
本篇是对ResNet学习的总结,希望对你有帮助。
一、ResNet背景介绍
ResNet在2015年被提出,该文章称为Deep Residual Learning for Image Recognition 并且该网络在ImageNet比赛分类任务上获得第一名,这个文章一出可以说影响十分巨大,以至于ResNet网络中提出的残差结构在如今应用越来越广泛。
那么我们可以先抛出一个问题,为什么ResNet如此好用呢?
答:ResNet的核心是残差结构,我们知道网络越深的时候,提取到的不同层次的信息会越多,但随着网络层数的增加,网络很大程度可能出现梯度消失和梯度爆炸情况,loss不减反增,传统对应的解决方案则是数据的初始化,批标准化(batch normlization)和正则化,但是这样虽然解决了梯度传播的问题,深度加深了,可以训练十几或者几十层的网络,却带来了另外的问题,就是网络性能的退化问题,深度加深了,错误率却上升了,并且确定这不是过拟合导致的,因为过拟合训练集的准确率应该很高。因此为解决随着深度加深,性能不退化,残差网络就出现了,深度残差网络用来解决性能退化问题,其同时也解决了梯度问题,更使得网络的性能也提升了,用了残差结构的网络深度可以到达几百层。
二、ResNet网络结构
2.1 ResNet网络结构
如上图,ResNet也和VGG一样,做了更多个网络设计,有18层,34层,50层,101层,152层,并且虽然层数不同,但都可以分为5部分,分别为conv1,conv2_x,conv3_x,conv4_x,conv5_x。这里要注意下,50层、101层都是将全连接层和卷积层算入,池化并不算,以50层为例,conv1有1层,中间有3+4+6+3=16个卷积块,每个卷积块又有3层,故有48层,最后加上输出层softmax为全连接层,一共刚好50层。我们还可以看到50层的ResNet的FLOPs(浮点计算量)是3.8×109,是38亿,而以前的VGG有196亿,这就是二者计算量的区别,也可以体现残差结构的优势。2.2 残差block
我们先来看看ResNet网络结构,如下图
前言:梯度消失产生的原因就是在误差反向传播过程中,每一层都要乘以该层激活函数的导数,对于sigmoid型激活函数,其导数始终小于等于1的,所以反向传播过程中误差越来越小,梯度也越来越小,参数也就越来越难更新。残差结构就是让求梯度时会有一个常数项存在,就不存在梯度消失的问题,如下求导,残差结构跳跃连接,也就是identity左边弯弯的线,多了个x,输出就成了,F(x)+x,求导后,就会产生常数项,无论后面对F求偏导多小,梯度都会>1。通俗解释就这个意思,希望能理解。
说完残差结构是怎么不让梯度消失的以后,我们再来对上图进行解释,写了identity左边有一条线,就是弯线,这条线称为identity mapping,文中形象称为shortcut connection,就是捷径的意思。 还有另一个概念,residual mapping,它指的是除了identity mapping以外的比直的线。这种跳跃连接的线,就是一种残差结构,残差模块在输入与输出之间建立了一个直接连接。如果网络已经到达最优,即准确率最优,继续加深网络,按道理性能会退化,但残差结构的residual mapping将被置为0,以后就不走"直线"residual mapping了,改成走identity mapping的捷径,残差结构的梯度是一直大于1的,这样理论上网络一直处于最优状态了,网络的性能也就不会随着深度增加而降低了。
2.3 ResNet中卷积块设计
左图是针对ResNet-34的卷积块,右图是针对ResNet-50/101/152,右图连两个1×1卷积核,一个是起到降维与升维的作用,还有一个就是减少计算量和参数。这是1×1卷积核的常见用法。之前GoogLeNet文章有详细说明,在Inception v1部分,有需要可以去看看,链接2.4 卷积跳跃连接过程
上图为论文中的图,我们可以看到ResNet-34中,有实线,也有虚线。我们介绍一下这两条线的含义。
实线:我们由图发现,图中实线都是通道(channels)相同的,即当输入和输出具有相同的维度,采用的就是identity mapping这个跳跃连接,也就是F(x)+x这个公式,加了跳跃的x。
虚线:与实线对应的虚线,则是通道发生变化时用到的,即进行了卷积,如通道64变128,再到后面128变256。对应公式是
论文中对该公式中的w解释是w用于卷积,调整通道。此时跳跃连接既没有引入外部参数又没有增加计算复杂度。实验结果:
如图,我们可以看到50/101/152层ResNet比34层ResNet的准确性要高不少。