在计算机视觉中,往往越深的网络,特征越多,能够训练更好的模型。而非常非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。通过在一个浅层网络基础上叠加y=x的层(称identity mappings,恒等映射),可以让网络随深度增加而不退化。但为了训练更好的网络,何恺明等人提出了残差网络(ResNet)。根据他的假设:如果对某一网络中增添一些可以学到恒等映射的层组成新的网络,那么最差的结果也是新网络中的这些层在训练后成为恒等映射而不会影响原网络的性能。ResNets是由残差块Residual block构建的。
1、残差块
设输入为x。假设图中最上方激活函数输入的理想映射为f (x)。左图虚线框中的部分需要直接拟合出该映射f (x),而右图虚线框中的部分需要拟合出有关恒等映射的残差映射f (x) − x。resnet学习的就是残差函数F(x) = H(x) - x。
ResNet沿用了VGG全3 × 3卷积层的设计。残差块里首先有2个有相同输出通道数的3 × 3卷积层。 每个卷积层后接一个批量归一化层和ReLU激活函数。然后我们将输入跳过这两个卷积运算后直接加在最后的ReLU激活函数前。这样的设计要求两个卷积层的输出与输入形状一样,从而可以相加。如果想改变通道数,就需要引入一个额外的1 × 1卷积层来将输入变换成需要的形状后再做相加运算。
2、ResNet模型
ResNet的前两层跟GoogLeNet中的一样:在输出通道数为64、步幅为2的7 × 7卷积层后接步幅为2的3 × 3的最大池化层。不同之处在于ResNet每个卷积层后增加的批量归一化层。GoogLeNet在后面接了4个由Inception块组成的模块。ResNet则使用4个由残差块组成的模块,每个模块使用若干个同样输出通道数的残差块。第一个模块的通道数同输入通道数一致。由于之前已经使用了步幅为2的最大池化层,所以无须减小高和宽。之后的每个模块在第一个残差块里将上一个模块的通道数翻倍,并将高和宽减半。