前言
最近在看有关ASSD目标检测的论文,其中提到使用ResNet101作为整个模型的主干网络,于是我就想着干脆把ResNet先通俗理解一遍,再进行下一步的ASSD模型的理解(ps:仅供参考,如有误解,还望指出)。
ResNet概述
在弄懂ResNet101之前,得先搞清楚什么是ResNet?(简单也很实用!)
ResNet是一种残差网络(Residual Network),残差指的就是观测值与预测值之间的差,对于残差网络,作者是这样表述的:一层网络可以看做y = H(x),而残差网络的一个残差块可以表示为H(x)= F(x) + x,从而残差F(x) = H(x) - x,在单位映射中,y=x便是观测值,而H(x)是预测值。其实我们可以把残差网络看作是一个子网络,通过对其不断堆砌而构成一个很深的网络。
在ResNet中提出了两种mapping(映射层),一个是identity mapping(恒等映射层:输入等于输出,其实指的就是本身y = x),其实就是上图中的x,另一个就是residual mapping(残差映射,其实指的是差:H(x) - x),其实就是F(x)。这个结构使用了一种连接方法叫shortcut connection或skip connections,按照中文意思就是走捷径的意思(就是上图中那条弯的线),当网络达到饱和的准确率时,恒等映射层直接将前一层输出传到后面的层,也就是说增加了网络的深度但不会增加误差。
理由?为啥要这样做?
这里可能就会产生疑问,既然就是用卷积层对网络进行简单的堆叠,为什么还要用这样的网络结构来堆叠深层网络呢?
众所周知,网络越深,我们所能获取的信息就更多,特征也会越丰富,并且,越深的网络提取的特征越抽象,越具有语义信息。但有实验已经表明,随着网络的不断加深,最终优化的效果反而越差,测试和训练数据的准确率降低了,这绝不是由于Overfit(过拟合)而造成的(按道理来说,过拟合情况下的训练集应该准确率很高),这其中主要的原因是网络的加深会造成梯度爆炸和梯度消失的问题。
那为什么ResNet可以解决上述问题呢?
针对这个问题,其实已经有解决办法:对输入数据和中间层的数据进行正则归一化,其目的是为了保证网络在反向传播的过程中采用随机梯度下降,让网络达到收敛,但是这种方法只能训练几十层,随着网络的加深,它会出现一个新的问题,那就是退化问题(网络层数增加,但是在训练集上的准确率却饱和甚至下降了)。
那如何解决退化问题呢?
深度残差网络。在前面提到过ResNet中有两种mapping(即identity mapping和residual mapping),如果网络已经到达饱和的最优准确率时,要是继续加深网络,residual mapping将被设置为0,就只剩下恒等映射层identity mapping(结合前面的ResNet网络结构图理解),这样的话,网络就一直处于最优状态了,网络的性能也就不会受到深度的影响而降低了(已经有实验证明了该方法可行)。
ResNet详解
实际上,ResNet模块并不像上述结构那么单一,ResNet block有两种,一种两层结构,一种三层结构(见下图),这两种设计结构是分别针对ResNet34(左图)和ResNet50/101/152(右图,又称bottleneck design),其中,bottleneck design是为了降低参数的数量,先用1×1的卷积将256维的channel降为64维,最后再用1×1的卷积恢复,使用参数个数为:
1×1×256×64 + 3×3×64×64 + 1×1×64×256 = 69632
如果不使用bottleneck design的话,就是简单的两个3×3×256的卷积层,使用的参数个数为:
3×3×256×256×2 = 1179648
整整相差了17倍左右,一般对于网络层次更深的ResNet,就会采用这种设计,以减少计算和参数量。
注:如果F(x)和x的channel维度不同,是无法对它们两个进行相加操作,此时必须对x进行升维操作,维度相同时才能计算。升维的方法主要有两种:全0填充和1×1卷积处理。
如下图所示,①号实线连接部分由于都是连接的3×3×64的卷积,channel维度相同,因此无需进行升维处理,可直接计算y = F(x) + x;②号虚线连接部分分别是3×3×64和3×3×128的卷积,channel维度不同,分别是64和128,无法进行相加操作,此时需要进行升维处理,引入一个卷积操作W用来调整x的channel维度,也即计算y = F(x) + Wx。
ResNet101
下表给出了5种不同深度的ResNet,分别是18,34,50,101,152,其实我们主要是看Resnet101的网络层分布,所有的网络都被分成了5个部分:conv1,conv2_x,conv3_x,conv4_x,conv5_x。
对于101-layer而言,首先输入7×7×64的卷积,然后是3×3的池化操作,紧接着就是经过3 + 4 + 23 + 3 = 33个building block,每个building block有3层卷积操作,最后有一个全连接层fc用于分类,网络层个数为:
1 + 33×3 + 1 =101(不计算池化操作,仅仅指卷积或者全连接层)
暂时先了解这么多,接下来就是弄懂ASSD的网络结构……下期再聊!
说明
论文:https://arxiv.org/pdf/1512.03385.pdf (2015年原版)
https://arxiv.org/pdf/1603.05027.pdf (2016年改进版)
【1】本文内容仅供个人学习所用,某些部分参考了一些博主的看法,由于个人能力有限,在理解层面上可能存在很多问题,希望大家能够提出改进的意见,欢迎交流想法,谢谢!
【2】如果您对该博客感兴趣,想要转载该博客,请与我联系。(也可关注个人公众号:刘先森学术日常,或qq邮箱:[email protected])我会第一时间回复大家,谢谢!