1. 引言
前面我们介绍了VGGNet在图像识别中的应用,在VGGNet中,作者提出随着CNN网络层数的加深,模型的效果会进一步得到提升,但是在这篇论文提出来之后,有学者发现,随着层数的加深,当深度达到一定数值之后,模型的准确率不仅没有提升,反而下降了,如图所示:
最开始有学者以为是梯度消失或爆炸的问题导致的,但是这个问题可以被Batch Normalization解决,并且加了Batch Normalization后依然出现类似的问题,另外,该现象也不是因为过拟合,因为如果是过拟合的话,模型在训练集上的准确率应该不会下降才对,因此,这里面肯定是因为模型中其他潜在的原因导致的。这个问题在2015年时被何凯明大神发现了,并且提出了一种新型的模型结构——ResNet,ResNet的提出可以说是图像识别任务中的里程碑,下面我们将对该模型进行具体介绍,并用tensorflow来实现它。
2. ResNet模型介绍
2.1 ResNet block介绍
记 H ( x ) \mathcal{H}(\mathrm{x}) H(x)为网络中几个堆叠的层所要拟合的潜在映射,其中, x x x是这几层中第一层的输入,那么,在VGGNet等传统的网络中,几个堆叠的层所要拟合的目标其实就是 H ( x ) \mathcal{H}(\mathrm{x}) H(x),而ResNet则只要求这几个层拟合目标为 F ( x ) : = H ( x ) − x \mathcal{F}(\mathrm{x}) :=\mathcal{H}(\mathrm{x})-\mathrm{x} F(x):=H(x)−x,即拟合该层输入与输出的残差,因此ResNet也被称为残差网络。其结构如下图所示,其实就是在每个block的最后一层relu层之前将输出与输入进行相加,这种结构也被称为“shortcut connections”,用公式表达如下:
y = F ( x , { W i } ) + x \mathrm{y}=\mathcal{F}\left(\mathrm{x},\left\{W_{i}\right\}\right)+\mathrm{x} y=F(x,{
Wi})+x
其中, x x x和 y y y分别表示一个block的输入和输出, F ( x , { W i } ) \mathcal{F}\left(\mathrm{x},\left\{W_{i}\right\}\right) F(x,{
Wi})表示当前block所要拟合的残差映射, F = W 2 σ ( W 1 x ) \mathcal{F}=W_{2} \sigma\left(W_{1} \mathrm{x}\right) F=W2σ(W1x),其中 W 1 W_{1} W1和 W 2 W_{2} W2为当前block的参数矩阵, σ \sigma σ表示relu激活函数,在该计算之后,则是残差连接,残差连接后再经过一层relu激活函数得到该block的输出。虽然最终block的输出与VGGNet等网络类似,但是却降低了模型拟合的难度。
不过,上面这种残差连接方式要求 F ( x ) \mathcal{F}(\mathrm{x}) F(x)与 x x x之间的维度必须完全相同,当两者的维度不一致时,可以通过一个线性变换将 x x