DenseNet
DenseNet模型的基本思路与ResNet一致,但它是前面所有层与后面层的密集连接(dense connection),它的名称也是由此而来。
如下图所示:
如上图所示,DenseNet每两个层之间都有直接的连接,因此该网络的直接连接个数为
L
(
L
+
1
)
2
\frac{L(L+1)}{2}
2L(L+1)。
对于每一层,使用前面所有层的特征映射作为输入,并且其自身的特征映射作为所有后续层的输入。
DenseNet的优点: 缓解了消失梯度问题,加强了特征传播,鼓励特征重用,并大大减少了参数的数量,改进了整个网络的信息流和梯度,这使得它们易于训练(这点与ResNet差不多)。
DenseNet与ResNet的主要区别
ResNet是每个层与前面的某层(一般是2~3层)跳跃连接在一起,连接方式是通过元素级相加。
DenseNet中,每个层都会与前面所有层在channel(通道)维度上连接(concat)在一起,并作为下一层的输入。相比ResNet,这是一种密集连接。
Dense Block 和 Transition layer
先看下图:
DenseNet 网络中两个比较重要的部分就是 Dense Block 和 Transition layer, 上图中包括3个Dense Block 和 2个Transition layer。
Dense Block
DenseBlock模块包含很多层,每层的特征图大小相同,层与层之间采用密集连接方式(如图 Figure.1)。
在DenseBlock中,各层特征图大小一致,可以直接在 channel 维度上 concat。DenseBlock中的非线性组合函数
H
(
.
)
H(.)
H(.) ,采用的是 BN+ReLU+3x3 Conv的结构,如图Figure.1。
与ResNet不同,所有DenseBlock中各个层卷积之后均输出
k
k
k 个特征图。
k
k
k 在DenseNet中称为 growth rate,是一个超参数。一般情况下使用较小的
k
k
k (比如12),就可以得到较佳的性能。假定输入层的特征图的channel数为
k
0
k_0
k0 ,那么
l
l
l 层输入的channel数为
k
0
+
k
(
l
−
1
)
k_0+k(l-1)
k0+k(l−1) 。
由于后面层的输入会非常大,DenseBlock内部可以采用bottleneck层来减少计算量,主要是原有的结构中增加 1x1 Conv,即 BN+ReLU+1x1 Conv+BN+ReLU+3x3 Conv,称为DenseNet-B结构。其中1x1 Conv得到
4
k
4k
4k 个特征图它起到的作用是降低特征数量,从而提升计算效率。
Transition layer
Transition layer连接两个相邻的DenseBlock,并且降低特征图大小。Transition layer结构为 BN+1x1 Conv+2x2 AvgPooling。
Transition layer可以起到压缩模型的作用。假定Transition layer的上层 DenseBlock 得到的特征图channels数为
m
m
m ,Transition层可以产生
[
θ
m
]
[\theta m]
[θm] 个输出特征图,其中
0
<
θ
<
=
1
0<\theta<=1
0<θ<=1 是压缩系数(compression rate)。当
θ
<
=
1
\theta<=1
θ<=1 时,特征个数经过Transition layer 没有变化,即无压缩,而当压缩系数
θ
<
1
\theta<1
θ<1 时,这种结构称为DenseNet-C,文中使用
θ
=
0.5
\theta=0.5
θ=0.5 。对于使用bottleneck层和压缩系数
θ
<
1
\theta<1
θ<1 的Transition layer组合的结构称为DenseNet-BC。