idea来源:
在随机深度网络(deep networks with stochastic depth)paper中,提出一种类似dropout的方法改进ResNet,作者发现在训练时每一步被随机丢掉一些层,可以显著提高ResNet的泛化性能。这带给作者两点启发:
- 神经网络的设计并不一定要是一个递进层次结构,也就是说网络中的某一层可以不仅仅依赖于紧邻的上一层的特征,而可以更依赖于更之前学到的特征。
- 随机丢弃一些层不会破坏算法的收敛性,说明ResNet具有冗余性,每一层都只提取了很少的特征(即所谓的残差)。
因此,作者提出两点:
- 让网络中的每一层都直接与前面的层相连,实现特征的重复利用;
- 把网络的每一层设计的特别窄(即只学习非常少的feature map),达到降低冗余性的目的。
DenseNet优点:
缓解梯度消失问题
把前面的层带到后面来,ResNet中“残差”思想体现。paper里说的是“create short paths from early layers to later layers”。
增强feature的传递,使feature重复利用(省计算,效率高)
减少参数数量(节省带宽,降低存储开销)
在CNN设计中,参数数量,计算力,内存占用等都是极为重要的考虑,Bottleneck layer设计(1x1卷积的使用)、down-sampling设计(stride convolution,pooling)、dropout、BN、No FC(全卷积网络的设计)等都是有利于省参数、省计算的操作。模型压缩需要重点关注一下!
抗过拟合
原因解释:神经网络每一层提取到的特征都相当于对输入数据的一个非线性变换,而随着深度的增加,变换的复杂度也逐渐增加(更多非线性函数的复合)。相比于一般神经网络的分类器直接依赖于网络最后一层(复杂度最高)的特征,DenseNet可以综合利用浅层复杂度低的特征,因而可以更容易得到一个光滑的具有更好泛化性能的决策函数。
y由于DenseNet不容易过拟合,在数据集不是很大的时候表现尤其突出。可以省略在ImageNet上的预训练,在医学图像,卫星图像等(与预训练的ImageNet自然图像有明显差别)任务上具有非常广阔的应用前景。
相关链接
Torch implementation:
https://github.com/liuzhuang13/DenseNet/tree/master/modelsPyTorch implementation:
https://github.com/gpleiss/efficient_densenet_pytorchMxNet implementation:
https://github.com/taineleau/efficient_densenet_mxnetCaffe implementation:
https://github.com/Tongcheng/DN_CaffeScript具体细节:DenseNet算法详解