ResNet 网络是在 2015年 由微软实验室提出,斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名。获得COCO数据集中目标检测第一名,图像分割第一名。
在ResNet网络的创新点:
- 提出 Residual 结构(残差结构),并搭建超深的网络结构(可突破1000层)
- 使用 Batch Normalization 加速训练(丢弃dropout)
下图是ResNet34层模型的结构简图:
为什么提出残差结构
在ResNet网络提出之前,传统的卷积神经网络都是通过将一系列卷积层与池化层进行堆叠得到的。
一般我们会觉得网络越深,特征信息越丰富,模型效果应该越好。但是实验证明,当网络堆叠到一定深度时,会出现两个问题:
- 梯度消失或梯度爆炸:若每一层的误差梯度小于1,反向传播时,网络越深,梯度越趋近于0
- 退化问题:在解决了梯度消失、爆炸问题后,仍然存在深层网络的效果可能比浅层网络差的现象
总结就是,当网络堆叠到一定深度时,反而会出现深层网络比浅层网络效果差的情况。
如下图所示,20层网络 反而比 56层网络 的误差更小:
- 对于梯度消失或梯度爆炸问题,ResNet论文提出通过数据的预处理以及在网络中使用 BN(Batch Normalization)层来解决。
- 对于退化问题,ResNet论文提出了 residual结构(残差结构)来减轻退化问题,下图是使用residual结构的卷积网络,可以看到随着网络的不断加深,效果并没有变差,而是变的更好了。(虚线是train error,实线是test error)
什么是残差结构
为了解决深层网络中的退化问题,可以人为地让神经网络某些层跳过下一层神经元的连接,隔层相连,弱化每层之间的强联系。这种神经网络被称为 残差网络 (ResNets)。
残差网络由许多隔层相连的神经元子模块组成,我们称之为 残差块 Residual block。单个残差块的结构如下图所示:
上图中红色部分称为 short cut 或者 skip connection(也称 捷径分支),直接建立
a
[
l
]
a^{[l]}
a[l]与
a
[
l
+
2
]
a^{[l+2]}
a[l+2]的隔层联系。其前向传播的计算步骤为:
- z [ l + 1 ] = W [ l + 1 a [ l ] + b [ l + 1 ] z^{[l+1]}=W^{[l+1}a^{[l]}+b^{[l+1]} z[l+1]=W[l+1a[l]+b[l+1]
- a [ l + 1 ] = g ( z [ l + 1 ] ) a^{[l + 1]} = g(z^{[l+1]}) a[l+1]=g(z[l+1])
- z [ l + 2 ] = W [ l + 2 a [ l + 1 ] + b [ l + 2 ] z^{[l+2]}=W^{[l+2}a^{[l+1]}+b^{[l+2]} z[l+2]=W[l+2a[l+1]+b[l+2]
- a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) a^{[l + 2]} = g(z^{[l+2]} + a^{[l]}) a[l+2]=g(z[l+2]+a[l])
a
[
l
]
a^{[l]}
a[l]直接隔层与下一层的线性输出层相连,与
z
[
l
+
2
]
z^{[l+2]}
z[l+2]共同通过激活函数(ReLU)输出
a
[
l
+
2
]
a^{[l+2]}
a[l+2]
由多个 残差块 组成的神经网络就是 残差网络 。其结构如下图所示:
实验表明,这种模型结构对于训练非常深的神经网络,效果很好。另外,为了便于区分,我们把 非残差网络 称为 Plain Network。
ResNet中的残差结构
实际应用中,残差结构的 short cut 不一定是隔一层连接,也可以中间隔多层,ResNet所提出的残差网络中就是隔多层。
跟VggNet类似,ResNet也有多个不同层的版本,而残差结构也有两种对应浅层和深层网络:
ResNet | 残差结构 | |
---|---|---|
浅层网络 | ResNet18/34 | Basic |
深层网络 | ResNet50/101/152 | Bottleneck |
下图中左侧残差结构称为 BasicBlock,右侧残差结构称为 Bottleneck
对于深层的 Bottleneck,1×1的卷积核起到降维和升维(特征矩阵深度)的作用,同时可以大大减少网络参数。
可以计算一下,假设两个残差结构的输入特征和输出特征矩阵的深度都是256维,如下图:(注意左侧结构的改动)
那么两个残差结构所需的参数为:
注:CNN参数个数 = 卷积核尺寸×卷积核深度 × 卷积核组数 = 卷积核尺寸 × 输入特征矩阵深度 × 输出特征矩阵深度
降维时的short cut
观察下图的 ResNet18层网络,可以发现有些残差块的 short cut 是实线的,而有些则是虚线的。
这些虚线的 short cut 上通过1×1的卷积核进行了维度处理(特征矩阵在长宽方向降采样,深度方向调整成下一层残差结构所需要的channel)。
下面是 ResNet 18/34 和 ResNet 50/101/152 具体的实线/虚线残差结构图:
-
ResNet 18/34
-
ResNet 50/101/152s
迁移学习简介
迁移学习是一个比较大的领域,我们这里说的迁移学习是指神经网络训练中使用到的迁移学习。
在迁移学习中,我们希望利用源任务(Source Task)学到的知识帮助学习目标任务 (Target Task)。例如,一个训练好的图像分类网络能够被用于另一个图像相关的任务。再比如,一个网络在仿真环境学习的知识可以被迁移到真实环境的网络。迁移学习一个典型的例子就是载入训练好VGG网络,这个大规模分类网络能将图像分到1000个类别,然后把这个网络用于另一个任务,如医学图像分类。
为什么可以这么做呢?如下图所示,神经网络逐层提取图像的深层信息,这样,预训练网络就相当于一个特征提取器。
- 使用迁移学习的优势:
1.能够快速的训练出一个理想的结果
2.当数据集较小时也能训练出理想的效果
注意:使用别人预训练好的模型参数时,要注意别人的预处理方式。 - 常见的迁移学习方式:
1.载入权重后训练所有参数
2.载入权重后只训练最后几层参数
3.载入权重后在原网络基础上再添加一层全连接层,仅训练最后一个全连接层