残差网络(ResNet)与稠密连接网络(DenseNet)

ResNet

残差块

让我们聚焦于神经网络局部。如图5.9所示,设输入为 ???? 。假设我们希望学出的理想映射为 ????(????) ,从而作为图5.9上方**函数的输入。左图虚线框中的部分需要直接拟合出该映射 ????(????) ,而右图虚线框中的部分则需要拟合出有关恒等映射的残差映射 ????(????)−???? 。残差映射在实际中往往更容易优化。以本节开头提到的恒等映射作为我们希望学出的理想映射 ????(????) 。我们只需将图5.9中右图虚线框内上方的加权运算(如仿射)的权重和偏差参数学成0,那么 ????(????) 即为恒等映射。实际中,当理想映射 ????(????) 极接近于恒等映射时,残差映射也易于捕捉恒等映射的细微波动。图5.9右图也是ResNet的基础块,即残差块(residual block)。在残差块中,输入可通过跨层的数据线路更快地向前传播。

残差网络(ResNet)与稠密连接网络(DenseNet)
ResNet沿用了VGG全 3×3 卷积层的设计。残差块里首先有2个有相同输出通道数的 3×3 卷积层。每个卷积层后接一个批量归一化层和ReLU**函数。然后我们将输入跳过这两个卷积运算后直接加在最后的ReLU**函数前。这样的设计要求两个卷积层的输出与输入形状一样,从而可以相加。如果想改变通道数,就需要引入一个额外的 1×1 卷积层来将输入变换成需要的形状后再做相加运算。

残差网络

ResNet使用4个由残差块组成的模块,每个模块使用若干个同样输出通道数的残差块。第一个模块的通道数同输入通道数一致。由于之前已经使用了步幅为2的最大池化层,所以无须减小高和宽。之后的每个模块在第一个残差块里将上一个模块的通道数翻倍,并将高和宽减半。

DenseNet

稠密块

残差网络(ResNet)与稠密连接网络(DenseNet)
图中将部分前后相邻的运算抽象为模块 ???? 和模块 ???? 。与ResNet的主要区别在于,DenseNet里模块 ???? 的输出不是像ResNet那样和模块 ???? 的输出相加,而是在通道维上连结。这样模块 ???? 的输出可以直接传入模块 ???? 后面的层。在这个设计里,模块 ???? 直接跟模块 ???? 后面的所有层连接在了一起。这也是它被称为“稠密连接”的原因。

DenseNet的主要构建模块是稠密块(dense block)和过渡层(transition layer)。前者定义了输入和输出是如何连结的,后者则用来控制通道数,使之不过大。

过渡层

由于每个稠密块都会带来通道数的增加,使用过多则会带来过于复杂的模型。过渡层用来控制模型复杂度。它通过 1×1 卷积层来减小通道数,并使用步幅为2的平均池化层减半高和宽,从而进一步降低模型复杂度。
参考书:《动手学深度学习》