描述

DenseBlock

DenseNet 的核心是 DenseBlock,在该 block 内,每一层的输出都会作为后面所有层的输入,每一层都会接受前面所有层的输出作为输入(通过 concat)。假设该 block 一共有 $L$ 层(不包括输入),那么一共包含 $\frac{L \times (L + 1)}{2}$ 个连接。

以上图为例,该 block 具有 $5$ 层(4 层 BN-ReLU-Conv 和 1 层 Transition Layer),那么一共拥有 $\frac{5 \times (5 + 1)}{2} = 15$ 个连接。由于每个 block 内部要求特征图的大小一致,因此 pooling 操作被放到串联两个 Dense Block 的 Transition Layer 中(即 BN-ReLU-Conv1x1-avgpool2x2。注意这里还有一个超参 Grouth rate(增长率?),其定义为 DenseBlock 内每一层的通道数,该参数一般设置得比较小(例如 12、24),否则 DenseBlock 内部的计算量将非常巨大。

为了进一步压缩计算量,作者还提出了在 DenseBlock 中结合 bottleneck,即对于每一层的输入,将之前所有层的输出 concat 之后先经过一个 $1 \times 1$ Conv 以压缩维度,再进行 BN-ReLU-Conv 操作。该结构被称为 DenseNet-B。

一个完整的 DenseNet 示例如下:

DenseNet

DenseNet 的优缺点如下:

  • (+) 特征重用能力强。
  • (+) 与 ResNet 相比,大大减少参数和计算量(因为性能强)。
  • (-) DenseNet 的普通实现需要大量的内存(每次 concat 之后经过 BN,因此此处要保留特征以待后续的反向传播),甚至造成与网络深度成平方的显存需求(已经有工作在做 DenseNet 的省内存实现,速度换显存)。

参考

▲