1.模型
传统的卷积神经网络CNN为了更好,更高效、更准确的去挖掘深层特征,会将网络加深或者将网络结构变宽使得模型能更好的去描述输入数据内容,如google在2014年提出的Inception Net就是在原有的CNN网络上添加了卷积核为1*1的边缘卷积。具体如图:
上图显示,inception moel共四个分支,四个分支都用到了1*1,来进行低成本跨通道组织信息:①第一个分支采用了1*1的卷积,这也是NIN提出的一个重要结构。1*1的卷积是一个非常好的结构,它可以跨通道组织信息,提高网络的表达能力,同时可以对输出通道升维和降维。②第二个分支先使用了1*1卷积,然后连接3*3卷积,相当于进行了两次特征变换。③第三个分支和第二个分支的作用类似,先是1*1卷积,然后连接5*5卷积。④第四个分支先是一个3*3最大池化,1*1卷积。inception model的4个分支在最后通过聚合操作合并(在输出通道数这个维度上聚合),其包含了3种不同尺寸的卷积和1个最大池化,增加网络对不同尺度的适应性,这一部分和multi-scale的思想类似。也就是说稀疏结构是非常适合神经网络的结构,尤其是对大而深的神经网络,不仅可以减轻过拟合同时也可以降低计算量。但是随着网络层次的加深,模型抽取出的特征也会更加抽象,使得模型最后忽略了数据中的细节信息。并增加计算机的运行成本,即耗时过长。因此,CVPR2017年的Best Paper中出现了DenseNet来缓解网络层数加深和变宽之后带来的一系列问题。DenseNet网络脱离了原有的加深变宽思想,从特征角度去考虑。通过特征的重复使用和旁路设置(Bypass)设置,该网络既大幅度减少了网络的参数量,又在一定程度上缓解了gradient vanishing问题的产生.结合信息流和特征复用的假设。具体网络结构如图所示:
在同一个Denseblock中要求feature size保持相同大小,在不同Denseblock之间设置transition layers实现Down sampling, 在作者的实验中transition layer由BN + Conv(1×1) +2×2average-pooling组成。在Denseblock中,假设每一个非线性变换H的输出为K个feature map, 那么第i层网络的输入便为K0+(i-1)×K, 这里我们可以看到DenseNet和现有网络的一个主要的不同点:DenseNet可以接受较少的特征图数量作为网络层的输出,如下图所示:
原因就是在同一个Denseblock中的每一层都与之前所有层相关联,如果我们把feature看作是一个Denseblock的全局状态,那么每一层的训练目标便是通过现有的全局状态,判断需要添加给全局状态的更新值.因而每个网络层输出的特征图数量K又称为Growthrate,同样决定着每一层需要给全局状态更新的信息的多少.我们之后会看到,在作者的实验中只需要较小的K便足以实现state-of-art的性能.虽然DenseNet接受较少的k,也就是feature map的数量作为输出,但由于不同层featuremap之间由cat操作组合在一起,最终仍然会是feature map的channel较大而成为网络的负担.作者在这里使用1×1Conv(Bottleneck)作为特征降维的方法来降低channel数量,以提高计算效率.经过改善后的非线性变换变为BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3),使用Bottlenecklayers的DenseNet被作者称为DenseNet-B.在实验中,作者使用1×1卷积生成channel数量为4k的featuremap。为了进一步优化模型的简洁性,我们同样可以在transition layer中降低featuremap的数量.若一个Denseblock中包含m个feature maps,那么我们使其输出连接的transitionlayer层生成⌊θm⌋个输出feature map.其中θ为Compression factor, 当θ=1时,transitionlayer将保留原feature维度不变.作者将使用compression且θ=0.5的DenseNet命名为DenseNet-C, 将使用Bottleneck和compression且θ=0.5的DenseNet命名为DenseNet-BC。
从图中我们可以得出以下结论:a) 一些较早层提取出的特征仍可能被较深层直接使用。b) 即使是Transition layer也会使用到之前Denseblock中所有层的特征。c) 第2-3个Denseblock中的层对之前Transition layer利用率很低,说明transition layer输出大量冗余特征.这也为DenseNet-BC提供了证据支持,既Compression的必要性。d) 最后的分类层虽然使用了之前Denseblock中的多层信息,但更偏向于使用最后几个feature map的特征,说明在网络的最后几层,某些high-level的特征可能被产生。
实验结果:
作者在多个benchmark数据集上训练了多种DenseNet模型,并与state-of-art的模型(主要是ResNet和其变种)进行对比:
由上表我们可以看出,DenseNet只需要较小的Growth rate(12,24)便可以实现state-of-art的性能,结合了Bottleneck和Compression的DenseNet-BC具有远小于ResNet及其变种的参数数量,且无论DenseNet或者DenseNet-BC,都在原始数据集和增广数据集上实现了超越ResNet的性能。
本文具体代码和本人改进代码见:https://github.com/LLAYGDD/DenseNet.git