1.目的
为了解决随着网络层次加深带来的训练困难问题而提出了一个新的残差神经网络。
随着网络层次的加深,训练的时候出现梯度消失/爆炸,这导致了网络难以收敛。通过标准化后的初始化和中间初始化层(normalized initialization and intermediate normalization layers)可以使网路开始收敛,但是网络开始收敛之后,又出现其他问题:
“with the network depth increasing, accuracy gets saturated and then degrades rapidly.”
如下图所示:
实际上要解决的问题是为什么随着网络的加深,精度却下降。
2.deep residual learning framework
将目标的映射表示为
H
(
x
)
\mathcal{H}(\mathrm{x})
H(x), 实际的堆叠层映射为
F
(
x
)
\mathcal{F}(\mathrm{x})
F(x), 令
F
(
x
)
:
=
H
(
x
)
−
x
\mathcal{F}(\mathrm{x}):=\mathcal{H}(\mathrm{x})-\mathrm{x}
F(x):=H(x)−x
那么目标映射就能表示为:
F
(
x
)
+
x
\mathcal{F}(\mathbf{x})+\mathbf{x}
F(x)+x
另外他们做的假设是:优化残差映射比优化原始未引用映射更容易。
残差网络实现的方式如上如,等价于使用前馈神经网络加上适当的“shortcut connections”。这里的“shortcut connections”不做任何的操作,直接复制原来的值,然后通过相加的方式与堆叠网络的输出合并。直接使用原来的值做跨层连接的好处是不增加额外的参数和计算复杂度,只需要在原来的网络基础上少量修改即可直接训练。
残差结构为什么有效?
如果添加的层可以被构造为identity mappings,即
F
(
x
)
x
\mathcal{F}(\mathrm{x})~x
F(x) x,那么一个更深层次的模型的训练误差应该不大于它的浅层模型。退化问题表明,模型在用多个非线性层逼近同一映射时可能存在困难。在残差学习重构中,如果identity mappings是最优的,则模型可以简单地将多个非线性层的权值趋近于零来逼近identity mappings 。
keras实现
使用Keras实现时主要是Merging layers的使用。
merge的方式有8种:
- 按照某个维度拼接
- 求均值
- 求每个输入list的最大值
- 求每个输入list的最小值
- 相和
- 相减
- 相乘,对应位置的值相乘
- 点乘,矩阵的相乘
其他关于ResNet详细的分析和代码实现的博客
(1)ResNet 论文
(2)Understand and Implement ResNet-50 with TensorFlow 2.0
(3)ResNet论文笔记及代码剖析
(4)TensorFlow2.0实现ResNet