论文:Densely Connected Convolutional Networks
作者:Gao Huang, Zhuang Liu, Kilian Q. Weinberger, Laurens van der Maaten
中心思想:非常简单直接,把ResNet的residual connection搞到极致,每一层的输出都直连到后面所有的层的输入。
原理
ResNet是上一层输出作为输入,做变换,然后加上上一层的输入:
而DenseNet则是之前所有层的输出,都直连到后面的每一层,每一层接受前面所有层的输出:
具体的网络结构图如下:
因为是这样的稠密连接,所以网络称之为DenseNet。
然后因为要多层输出之间叠加concatenate,所以需要尺寸相同,但是到后面要降维啊,所以类似于ResNet,一组Block之间如上连接,然后加一个降维的层,然后再是一组如上连接,网络总体结构如下:
分析
这样的结构的优点显而易见:
- 向前:每一层都可以看到所有的之前的输入,对于网络已经学习到的『知识』(即已有feature map),以及原始输入,都可以直接access到,然后再添加自己的『知识』到全局知识库。鼓励了特征的重用,特征重用就可以减少不必要的计算量。另外,多层之间可以很好地进行交互,每一层都接受前面所有层的输出,具有多层特征融合的特性;
- 向后:跳跃结构,可以很近地连接到最后的loss,训练起来很容易,直接接受最终loss的监督,深层监督,解决梯度消失的问题,并且,能起到正则化的作用缓解过拟合;
但是这样的结构,有一个明显的缺点,就是特征会爆炸,每一层的输入都连接到后面的所有层,这样特征越来越多越来越多,作者用一个增长率的概念来量化这个过程,定义为每一层输出的feature map数量,即每一层增加的feature map数量。因为特征数量会快速增加,所以作者用了很『轻』的层,不像通常的每层输出上百个通道,DenseNet每一层只输出比如4、16这样很少的层,每一层都很轻。并且,每一层也使用了1x1来降维。
网络结构
网络的具体结构如下所示:
上面的每一个conv指的是一个BN-ReLU-Conv的复合变换。
总结
思想简单直接,效果也不错,更少的参数量达到相似或更好的结果。当然这里又有一个『但是』。。。但是,更少的参数量并不意味着更节约显存或训练每一步会更快。因为有稠密直连的过程,所以各个feature都要存下来,实际上很容易爆显存,另外,这种稠密连接也意味着反向传播计算梯度更加复杂,每一步训练并不一定会更快。不过,训练好前向inference的时候这个问题不大。另外,作者也针对这个问题做了改进,缓解了这个问题。
总体来说,属于ResNet这个路数,用shortcut来达到前面用好输入和历史知识,后面直连loss深层监督更好训练,思路简洁,实际效果也不错。
从这里的结果来看,ImageNet上的Top1准确率下面三个模型大致相当:
- DenseNet161 77.560
- FBResNet152 77.386
- Inception v3 77.294
而模型规模则和Inception v3相当,比ResNet152要小多了。
链接:https://zhuanlan.zhihu.com/p/32989555
本文暂时没有评论,来添加一个吧(●'◡'●)