DenseNet---比ResNet更优模型

DenseNet实现代码

DenseNet

DenseNet模型的基本思路与ResNet一致,但它是前面所有层与后面层的密集连接(dense connection),它的名称也是由此而来。
如下图所示:
DenseNet---比ResNet更优模型
如上图所示,DenseNet每两个层之间都有直接的连接,因此该网络的直接连接个数为L(L+1)2\frac{L(L+1)}{2}
对于每一层,使用前面所有层的特征映射作为输入,并且其自身的特征映射作为所有后续层的输入。
DenseNet的优点: 缓解了消失梯度问题,加强了特征传播,鼓励特征重用,并大大减少了参数的数量,改进了整个网络的信息流和梯度,这使得它们易于训练(这点与ResNet差不多)。

DenseNetResNet的主要区别

ResNet是每个层与前面的某层(一般是2~3层)跳跃连接在一起,连接方式是通过元素级相加
DenseNet中,每个层都会与前面所有层在channel(通道)维度上连接(concat)在一起,并作为下一层的输入。相比ResNet,这是一种密集连接。

Dense Block 和 Transition layer

先看下图:
DenseNet---比ResNet更优模型
DenseNet 网络中两个比较重要的部分就是 Dense Block 和 Transition layer, 上图中包括3个Dense Block 和 2个Transition layer。

Dense Block

DenseBlock模块包含很多层,每层的特征图大小相同,层与层之间采用密集连接方式(如图 Figure.1)。
在DenseBlock中,各层特征图大小一致,可以直接在 channel 维度上 concat。DenseBlock中的非线性组合函数 H(.)H(.) ,采用的是 BN+ReLU+3x3 Conv的结构,如图Figure.1。
与ResNet不同,所有DenseBlock中各个层卷积之后均输出 kk 个特征图。 kk 在DenseNet中称为 growth rate,是一个超参数。一般情况下使用较小的 kk (比如12),就可以得到较佳的性能。假定输入层的特征图的channel数为 k0k_0 ,那么 ll 层输入的channel数为k0+k(l1)k_0+k(l-1)
由于后面层的输入会非常大,DenseBlock内部可以采用bottleneck层来减少计算量,主要是原有的结构中增加 1x1 Conv,即 BN+ReLU+1x1 Conv+BN+ReLU+3x3 Conv,称为DenseNet-B结构。其中1x1 Conv得到 4k4k 个特征图它起到的作用是降低特征数量,从而提升计算效率。

Transition layer

DenseNet---比ResNet更优模型
Transition layer连接两个相邻的DenseBlock,并且降低特征图大小。Transition layer结构为 BN+1x1 Conv+2x2 AvgPooling
Transition layer可以起到压缩模型的作用。假定Transition layer的上层 DenseBlock 得到的特征图channels数为 mm ,Transition层可以产生 [θm][\theta m] 个输出特征图,其中 0<θ<=10<\theta<=1 是压缩系数(compression rate)。当 θ<=1\theta<=1 时,特征个数经过Transition layer 没有变化,即无压缩,而当压缩系数 θ<1\theta<1 时,这种结构称为DenseNet-C,文中使用 θ=0.5\theta=0.5 。对于使用bottleneck层和压缩系数 θ<1\theta<1 的Transition layer组合的结构称为DenseNet-BC。