本文已参与「新人创作礼」活动,一起开启掘金创作之路
DenseNet
《Densely Connected Convolutional Networks》
总体介绍
Densenet是从ResNet、stochastc paths等非直连网络中得到了灵感,作者发现它们的共同点在于都在尝试缩短网络中层与层之间的距离,ResNet是使用输入输出相连的方式使得输入的原样输出成为可能,消解该层使得前层和后层直连;stochastic paths则是在此基础上随机去除某些层,缩短前后连接。作者将这一思路贯彻到底,每一层的输入都是之前所有层输出的拼接,原先L层网络中只存在着L个连接,如今则有着层连接。这一方案带来额外的好处是网络的参数可以减少,因为我们不再于需要重复的去学习冗余的特征,而是通过前向连接直接使用,每层的channel数目相较于一般网络可以减少许多。
模型介绍
正如之前介绍的,DenseNet的主要思路就是层与层之间的稠密连接,每层的输入都是之前所有层的拼接组合:
但是CNN中经常会出现Pooling操作,导致不同层之间出现的特征图样大小并不一致,因此DenseNet中推出了Denseblock+Transition layer的结构,Denseblock中每层的输出特征图样大小一致可以直接连接,不同block间的特征大小不同,通过Transition layer中包含的pooling layer实现下采样,如下图:
Denseblock中的每一层都由BN+Relu+Conv构成,Denseblock内每层的输出通数目都为k,与其他的CNN架构相比通常k都是一个比较小的数如12,这一参数文中称之为增长率。transition layer则由Conv+Pooling构成。
衍生版本
虽然Denseblock中每层都只输出较少的特征图样,但由于每层都和之前的所有层相连接,导致通道数目仍然很多,卷积核的参数以及计算量很大。为此可以在每一层前添加1*1Conv以对输入特征进行降维,由此Denseblock中每层由BN+Relu+1*1conv+BN+Relu+Conv构成,1*1conv产生4k个输出,得到了DenseNet-B。 同样的transition layer中也含有1*1conv,我们同样可以降低Densblock最终输出的数目,假定前层得到特征图数目为m个,我们设置1*1conv得到个特征图样,,这样就形成了DenseNet-C。
实验
文章将不同超参数设计的DenseNet(网络总层数L、每个block层数k)和现有SOTA方法进行比较,发现了以下几个结论:
- DenseNet比现有方法要好,但DenseNet并不是越深越好,在较为简单的数据集下层数少的DenseNet反而取得了更好的效果。
- 随着DenseNet层数的增加(参数增加),模型的错误率在逐步的降低,这意味着DenseNet有效的运用到了增加的这些层,即深度深效果好,没出现过拟合现象。
- 参数较少时仍然有着很好的表现。
- 无论是在大数据集还是小数据集上,使用DenseNet相较于现有SOTA方法的提升都是很大且相近的,未发生过拟合。但的确观测到了一例参数增加,表现基本不变的情况,推测可以使用bottleneck layer解决。
- 在ImageNet上可视化结果表明,深层的特征确实会使用前层的特征输入,但在最终做出分类判决时更依仗于高层次的特征。
总结
文章提到了一个很有意思的概念,将CNN每一层的输入输出过程视作为状态的传递,当前层对state做出改变同时也保留了原始状态的某些部分,而ResNet则时将这种状态的保存显式化了。而Stochastic paths则在其基础上随机的“遗忘”掉了某些state,这其实就非常类似于LSTM了,保留了之前时刻状态的信息,但并没有全盘接受而是有所筛选,只不过是随机的。DensetNet相当于是加大了遗忘和保留中保留的比重,反复的在网络中刻印之前时刻的信息,但对应的遗弃部分却没有做出什么调整,如果对前层的连接不是全盘连接,而是有所筛选,可能就更加接近于LSTM的思路了,也算是有监督版本的stochastic paths。