Dense Nets的设计主要基于两点:
网络中的每一层都直接与其前面层相连,实现特征的重复利用;同时把网络的每一层设计得特别「窄」,即只学习非常少的特征图(最极端情况就是每一层只学习一个特征图),达到降低冗余性的目的。
DenseNets具有非常好的抗过拟合性能,尤其适合训练数据相对匮乏的应用。而且相对于resnet它省参数、省计算
接下来我们对整个网络结构进行分析:
首先我们看一下DenseNets网络结构图:
为了便于说明,我以Dense net-121为例。
它分为4个Dense Block块。Dense net的核心主要分为以下几个部分:
- 密集连接:为了提高信息流也就是个人理解的特征在层与层之间的连接。密集连接属于一个DenseBlock块里面的,不同的DenseBlock块不存在密集连接。
-
Composite function(复合功能):指的是上图中H1 H2 H3,这里面的操作包含:BN,Relu,3*3conv(padding=1,不改变feature map的尺寸)
-
Pooling layers:整个网络分为多个dense block,在一个dense block结束,连接下一个dense block之前,需要经过一个transition layers层(黄框部分),它包含了BN,1*1con pooling层
transition layers层为黄框标取的那一层,通过卷积与合并来改变特征映射的大小。
这是基于caffe的可视化结构图(截取了transition layers)。这里可能会有疑惑,为什么Dense block里面没有pooling层:因为Dense block块里面需要进行特诊通道连接,需要保证特征图大小一致,而下采样会改变特征图,所以没有采用pooling操作。
-
Growth rate(增长率):如果每个函数Hl生成K个要素图(K个特征通道),那么N层就有K0+(N-1)*K(K0为输入图的通道数)论文中给的增长率为K=32,相当与就是(H1与X1)这样一个过程通道数增加了K=32。在一个Dense Block里面它们与前面层做一个叠加以后,往后面传入就相当于后层与前面几层连接起来了。
-
Bottleneck layers(瓶颈层):虽然每个图层只生成K个输出特征图,但通常会有更多的输入。所以,在每次3*3的卷积之前可以引入1*1的卷积作为瓶颈层,以减少特征映射的数量(特征通道数)。论文中将feature map的数量统一减少到4K=128通道BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3)的形式
-
Compression(通道压缩):为了进一步提高模型的紧凑型,在论文中减少了过渡层的特征映射数量(通道数),每个过渡层都是减少的一半。