八、DenseNet
论文导读
Densely Connected Convolutional Networks(稠密连接的卷积神经网络)
意义:重新思考认识short path和feature reuse的意义,引入稠密连接思想;
-
相关研究:
1、Short Paths
解决深度神经网络中存在信息流通不畅的问题——输入数据消失以及梯度消失;
例子:ResNet中的跳连结构;
2、多级特征复用
多级特征复用可增加模型表征能力,也就是输出的score map由多级特征共同决定;
优点:无需额外计算,可得到低层、中层和高层的特征来进行分类,使模型更鲁棒;
论文概要
1、稠密连接(Dense connectivity)
说明:在每一个block中,每一层的输出均会直接连接到后面所有层的输入;
优点:
- 用较少的参数获得更多的特征,减少参数量明显,模型大小可以达到ResNet的十分之一;
- 低级特征得以复用,特征更丰富;
- 更强的梯度流动,跳连结构更多,梯度更容易向前传播;
2、DenseNet结构图
从图中可知,有121、169、201、264四种官方给出的网络深度,和ResNet同为层次较深的模型,参数量远小于ResNet;
头部卷积:采用7x7卷积核进行快速的下采样,这里思考是否有更有的方式;
Dense Block:主要是稠密连接的思想,浅层的特征会加入到深层的特征中;
Transition Layer:使用1x1卷积压缩一半,池化降采样;
3、Growth rate
稠密连接的方式,使得特征图通道随着网络层的加深不断增多,因此要控制特征图数量,Growth rate超参数就是用来控制卷积层中的卷积核个数;
4、Bottleneck layers——DenseN-B
瓶颈层来降低特征图通道数,减少后续卷积的计算量,主要形式类似ResNet中使用1x1卷积核降低通道数;
5、网络结构:
整体可分为三大块,头部卷积、Dense Block堆叠、全连接输出分类概率;
6、分析每一层特征重要性
结论:
(1)网络层的权重分布在各个特征图上,不仅关注上一层的特征图,还关注前面所有层的特征图;
(2)block3中看到的分类输出层对靠后的特征更加关注,可能是靠后的层得到的高级特征,更具有分辨力;
论文总结
-
关键点&创新点
1、将捷径连接与特征复用思想结合,同时借鉴级联机构思想,设计出稠密连接结构;
2、针对稠密连接,提出DenseNet-BC形式分别在block内部和transition部分采用1x1卷积进行参数量控制,使模型紧凑;
-
启发点
1、信息流通不顺畅时,普遍采用捷径连接来处理;
2、多采用捷径连接,便于信息流通、梯度传递,可使模型便于训练;
3、稠密连接在小数据集上起到正则作用,有种说法是DenseNet适合小数据集;
4、不同层处理得到的特征进行拼接,可丰富下一层网络输入特征的多样性,以及提高效率;
5、多级特征融合时,要在卷积层之前执行BN-ReLU,否则多个层级输出时执行BN,会导致特征的尺度不一致;
6、3x3卷积之前通过1x1卷积减少特征图通道的操作称为Bottleneck layer;
7、DenseNet的训练极其消耗存储空间,因为需要保留大量的特征图,用于反向传播计算;
-
缺陷:训练时消耗大量存储空间
计算图:用来描述运算的有向无环图;
在DenseNet训练过程中需要用到的计算图较多,消耗的存储空间较大;
关于深度学习中显存的占用,可参考以下文章:https://zhuanlan.zhihu.com/p/31558973
论文代码
模型结构图:
上图中,基础模块主要由三部分定义:DenseBlock、Denselayer、Transition
在DenseBlock中,每个Denselayer都会进行拼接,如下图所示:
def forward(self, init_features):
features = [init_features]
for name, layer in self.items():
new_features = layer(features)
features.append(new_features)
return torch.cat(features, 1)