寒假前学习了ResNet网络,开学后又重新复习了一遍。
ResNet在2015年由微软实验室提出,斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名。获得COCO数据集中目标检测第一名,图像分割第一名。
ResNet是一种具有跳跃连接和批量归一化的新型CNN架构,能训练一个152层的神经网络,通过堆叠的层集合学习残差,批量归一化在每个卷积之后、激活之前进行运用。 ResNet 网络的训练误差会随着层数增大而逐渐减小,并且在测试集上的表现也会变好。
在ResNet推出后不久,Google就借鉴了ResNet 的精髓,提出了Inception V4和Inception-ResNet-V2.并通过融合这两个模型,在ILSVRC数据集上取得了惊人的3.08%的错误率。
1.ResNet网络中的亮点
- 超深的网络结构(突破1000层)
- 提出residual模块(残差模块)
- 使用Batch Normalization加速训练(丢弃dropout)
为什么不用VGG一直叠加,也可以达到1000层?
如上图,简单地通过卷积层和最大化池化采样层堆叠网络行不通。层数越多,错误率越大。
随着网络层数不断加深,随之而来的就是梯度消失或者梯度爆炸问题。即使解决了以上问题(论文用BN方法),仍会有退化问题,即层数深的网络依旧没有层数少的网络效果好(论文中用残差结构解决)。
residual结构:
这两种结构分别针对ResNet34/16(左图)和ResNet50/101/152(右图),一般称整个结构为一个“building block” 。其中右图又称为“bottleneck design”,目的就是为了降低参数的数目.第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。
其中右图11的卷积核用来降维和升维。如11,64就是保持高宽不变,使得深度由256-d变为64-d。
那什么时候使用实线的shortcut,什么时候使用虚线残差结构呢?当输入特征矩阵和输出特征矩阵shape不同的时候使用虚线残差结构。如下图
:
如下图是原论文中给出的参数列表。
上表一共提出了5中深度的ResNet,分别是18,34,50,101和152,首先看表的最左侧,我们发现所有的网络都分成5部分,分别是:conv1,conv2_x,conv3_x,conv4_x,conv5_x,之后的其他论文也会专门用这个称呼指代ResNet50或者101的每部分。 例如:101-layer那列,101-layer指的是101层网络,首先有个输入7x7x64的卷积,然后经过3 + 4 + 23 + 3 = 33个building block,每个block为3层,所以有33 x 3 = 99层,最后有个fc层(用于分类),所以1 + 99 + 1 = 101层,确实有101层网络; 注:101层网络仅仅指卷积或者全连接层,而激活层或者Pooling层并没有计算在内;我们关注50-layer和101-layer这两列,可以发现,它们唯一的不同在于conv4_x,ResNet50有6个block,而ResNet101有23个block,两者之间差了17个block,也就是17 x 3 = 51层。
对于我们ResNet50/101/152,其实在conv2_x所对应的一系列残差结构的第一层也是虚线残差结构。因为它需要调整输入特征矩阵的channel,根据表格可知通过3x3的max pool之后输出的特征矩阵shape应该是[56, 56, 64],但我们conv2_x所对应的一系列残差结构中的实线残差结构它们期望的输入特征矩阵shape是[56, 56, 256](因为这样才能保证输入输出特征矩阵shape相同,才能将捷径分支的输出与主分支的输出进行相加)。所以第一层残差结构需要将shape从[56, 56, 64] --> [56, 56, 256]。注意,这里只调整channel维度,高和宽不变(而conv3_x, conv4_x, conv5_x所对应的一系列残差结构的第一层虚线残差结构不仅要调整channel还要将高和宽缩减为原来的一半)。
BN(Batch Normalization):
目的:使一批(Batch)feature map满足均值为0,方差为1的分布规律