DenseNet结构解读
1、网络结构
与Inception系列和ResNet网络不通,Inception网络主要是从网络的宽度方面改进网络的结构从而提高网络的表达能力,而ResNet主要是从网络的深度方面改进网络的结构来提高表达能力,而DenseNet则是通过特征图重用的方式来探索网络的潜能。
DenseNet让网络的每一层的输入变成所有前面层的叠加(concat),然后把它的特征图传递给所有接下来的网络层。
传统的CNN如果有L层则有L个连接,而DenseNet如果有L层,则有1/2 L(L+1)个连接,如下图所示:
用公式来表示的话,ResNet可以用公式表示为:
而DenseNet用公式表示则为:
参照ResNet v2的设计,其中H()函数由 BN + ReLU + 3*3 Conv 组成。此外,由于当特征图的尺寸发生变化时,公式(2)中的concat操作是不可行的。卷积网络中一个关键的部分是下采样层,它用来改变特征图的大小。为了使得我们网络的下采样更便利,我们把网络分解为多个Dense Block,如下图所示。我们把介于两个Dense Block之间的网络层称为转换层(transition layer),它用来卷积和池化。转换层由 BN + 1*1 Conv + 2*2 Avg pooling 组成。
此外,如果每个H()函数产生k个特征图,则第l层有 k0 + k*(l - 1)个输入特征图,其中k0是输入层的通道数。DenseNet和现在的网络的一个重要区别是DenseNet的网络层很窄,比如k = 12。我们把超参数k称为网络的增长率,增长率调节每层的网络对整个网络贡献多少新信息。尽管每个网络层值输出k个特征图,但是它的输入会非常多。
2、DenseNet的不同变体
- DenseNet(原文中3Composite function部分): 在每个Dense Block中,使用BN-ReLU-Conv(3x3)来运算,transiton layer使用BN-Conv(1x1)-AvgPOOL(2x2)
- DenseNet-B(原文中3Bottleneck layers部分): 在每个Dense Block中,采用Bottleneck layers,使用BN-ReLU-Conv(1x1)-BN-ReLU-Conv(3x3)来运算,这样能减少运算量,在Conv(1x1)中,产生4×k个特征图,在Conv(3x3)中,产生k个特征图。transiton layer使用BN-Conv(1x1)-AvgPOOL(2x2)
- DenseNet-C(原文中3Compression部分): 为了进一步提高模型紧密度,Dense Block中的操作使用DenseNet-B不变,当Dense Block产生m个特征图时,在transiton layer使用BN-Conv(1x1)-AvgPOOL(2x2)产生[θm]特征图(0<θ≤1)。作者在实验中使用θ=0.5
- DenseNet-BC(原文中3Compression部分): 在Dense Block和transition layer中,都使用θ来减少输出的特征图数量。
3、DensetNet系列对比
4、DensetNet优点
- 减轻了消失梯度(梯度消失)
- 加强了特征的传递
- 更有效地利用了特征
- 一定程度上较少了参数数量