DenseNet原理及其PyTorch实现

2020-06-25 387点热度 4人点赞

ResNet通过前层与厚层的“短路连接”(Shortcuts),加强了前后层之间的信息流通,在一定程度上缓解了梯度消失现象,从而可以将神经网络搭建得很深。更进一步,DenseDet最大化了这种前后信息交流,通过建立前面所有层与后面层的密集连接,实现了特征在通道维度上的复用,使其可以在参数与计算量更少的情况下实现比ResNet更优的性能,提出DenseNet的《Densely Connected Convolutional Networks》也一举拿下了2017年CVPR的最佳论文。

DenseNet的网络架构如下图所示,

图1

网络由多个Dense Block与中间的卷积池化组成,核心就在Dense Block中。Dense Block中的黑点代表一个卷积层,其中的多条黑线代表数据的流动,每一层的输入由前面的所有卷积层的输出组成。注意这里使用了通道拼接(Concatnate)操作,而非ResNet的逐元素相加操作。

DenseNet的结构有如下两个特性:

(1)神经网络一般需要使用池化等操作缩小特征图尺寸来提取语义特征,而Dense Block需要保持每个Block内的特征图尺寸一致来直接进行Concatnate操作,因此DenseNet被分成了多个Block。Block的数量一般为4。

(2)两个相邻的Dense Block之间的部分被称为Transition层,具体包括BN、ReLU、1*1卷积、2*2平均赤化操作。1*1卷积的作用是降维,起到压缩模型的作用,而平均池化则是降低特征图的尺寸。

具体的Block实现细节如下图所示

图2

每一个Block由若干个Bottleneck的卷积层组成,对应第一个图中的黑点。Bottleneck由BN、ReLU、1*1卷积、BN、ReLU、3*3卷积的顺序构成。

关于Block,有以下4个细节需要注意:

1)每一个Bottleneck输出的特征通道数是相同的,例如这里的32.同时可以看到,经过Concatnate操作后的通道数是按32的增长量增加的,因此这个32也被称为GrowthRate。

2)这里1*1卷积的作用是固定输出通道数,达到降维的作用。当几十个Bottleneck相连接时,Concatnate后的通道数会增加到上千,如果不增加1*1的卷积来降维,后续3*3卷积所需的参数量会急剧增加。1*1卷积的通道数通常是GrowthRate的4倍。

隐藏内容需要支付:¥5

未经允许不得转载!DenseNet原理及其PyTorch实现

本文地址:https://ai.52learn.online/998

站长邮箱:ai52learn@foxmail.com