github链接:https://github.com/liuzhuang13/DenseNet
MXNet版本代码(有ImageNet预训练模型):https: //github.com/miraclewkf/DenseNet
如果卷积神经网络中接近输入输出的层间增加更多连接,性能可以更好。我们据此提出了稠密的卷积神经网络(DenseNet),其中的每一层以前馈的方式连接到其它层。L层的传统卷积网络层间有L个连接,DenseNet则有L(L+1)/2个直连接。DenseNet中每一层,都使用前面所有层的feature-maps作为输入,当前层的feature-map亦为后续所有层的输入。DenseNet有如下几个显著优点:
论文以CIFAR-10, CIFAR-100, SVHN, 和ImageNet这四个数据集上的对象识别任务为基准,DenseNet在参数和计算成本更少的情况下性能更优。代码和预训练模型可以在[http://github.com/liuhuang13/DenseNet]上找到。
卷积神经网络(CNN)已成为对象识别的主要方法,近年来得到突飞猛进得发展,并逐步发展到百层之多。随着卷积神经网络层数得递增,逐渐凸显出梯度消失的问题。继而出现一些解决办法,如ResNets、Highway Networks通过恒等连接(identity connections)的方法进行层间连接,Stochastic depth随机丢弃层以简化ResNets目的是获得更好的信息和梯度流,FractalNets(分形网络)重复应用单一扩展规则生成一个极深的网络,其中包含很多短路连接(short paths)。这个网络的拓扑结构和训练过程各有不同,但其共同特点是都包含短路连接,形成了跨层的融合。
论文将这一点提取出来加以放大,提出了更密集的连接模型 ---- 将所有层间进行了直接连接(有同样大小的匹配的feature-maps)以获取最大的信息流。为了保持前馈特性,每一层将之前的所有层的特征映射作为输入,并将当前层的特征映射传到之后所有层,如图1所示,一个5层的dense block的网络,增长率k=4,每一层将之前的feature-maps作为输入:
对比ResNets,作者没有把通过一个层的特征进行求和,而是通过连接的方式把每一层的特征连接起来,就像一个list,每经过一层进行一次append。所以当经过层时,第层有个输入,所以对于一个层的网络,一共有个连接。
DenseNet看起来会比传统CNN参数多,事实上要更少,因为重新学习冗余的特征图的过程。传统前馈结构是一种带状态的算法,这种状态层层传递,改变状态的同时传递了有效信息。ResNets通过恒等变换(identity transformations)保留信息,ResNets的新变体中发现,很多层的贡献并不大,可以在学习工程中被随机丢弃。这让ResNets的状态机制和展开的RNN相似(参考文献13,看一下这篇),但因为ResNets每层都有权重所以参数量巨大。论文提出DenseNet结构名明确的将作为添加的信息和需要保留的信息区开,DenseNet层非常窄(例如,每层只有12个滤波器),仅向网路的collective knowledge中添加一小部分feature-maps并保持其余的feature-maps保持不变,最终的分类器基于网络中所有的feature-maps进行决策。
DenseNet的另一优点是整个网络中改进的信息流和梯度流,这使得它们更容易训练。每一层都能直接从损失函数和原始输入信号中获得梯度,有助于更深层次网络的训练。此外,密集连接能起到正则化的作用,可以减小在小规模数据集上过拟合。
假设一个卷积网络的单张输入图片,该网络包含层,每个层实现一个非线性转换,表示层号,可以是操作的复合函数,比如Batch Normalization(BN)、整流线性单元(ReLU)、池化层和卷积层。我们将第层的输出定义为。
传统CNN:层的输入为的输出,即
Resnet: 通过跳跃连接绕过了部分非线性变换,即
ResNet的一个优点就是梯度可以直接通过identity function从后面的层流到较前面的层。但是,identity function和输出通过汇合的方式结合可能会阻碍网络中的信息流(?不是特别明白)。
论文提出了提升信息流的新模型,每一层向其后所有层直接连接,如图1所示,层的输入为的输出,即
其中表示层的特征图,便于应用,我们将的输入连成一个张量。
是个复合函数,由三部分组成,分别是batch normalization,ReLU和一个3*3卷积。
当feature-maps的尺寸发生变化时,以上公式中的连接操作不可行。但是,卷积神经网络中可以采用下采样调整feature-maps的尺寸。将网络分为多个紧密相连的dense block以便进行下采样,如图2所示。我们将块之间的层称为过渡层,它们进行卷积和池化操作。我们实验中使用的过渡层包括一个BN
层和一个1x1
的卷积层,其次是一个2x2
的平均池化层。
如果每个产生个feature-map,第层会有个feature-maps,是输入层的通道数,是层数。DenseNet的特征之一是层数少,是模型中的超参,视为增长率。实验证明小增长率即可获得较好的结果。dense block中的每一层都可以获得前面层的所有feature-map,因此,可以访问网络的collective knowledge。每一层都可以将feature-map视作网络的全局状态,同时又将自己的个feature-map添加到全局状态。增长率决定了每层共享多少feature-map给全局状态。全局状态一经写入,可以从各个层读取。区别与传统网络结构,需要层层复制。
虽然每层输出个feature-map,但它的输入很多。在每个3x3卷积
前引入1x1卷积
作为bottleneck layer可以减少输入特征图的数量,提高计算效率。在实验中,指采用bottleneck layer的实验组,我们让每个1x1卷积处理4k个
feature-map(?看下4k怎么算出来的)
为了进一步提高模型的紧凑性,我们在过渡层减少feature-maps的数量。如果一个dense block包含个特征图,我们让其后的过渡层输出个feature-maps,其中表示压缩率,,当时经过过渡层的feature-maps不做任何变化,我们的实验中设定,指进行的压缩的实验组,指即采用bottleneck layer又进行压缩的实验组。
除ImgageNet外的所有数据集,DenseNet都有3个dense blocks,每个块的层数都是相等的。在进入第一个dense block前,对输入图像上进行一次16通道的卷积(或进行双倍增长率的??)。在卷积核大小为3x3的卷积层中,边缘填充1个像素的零值,以保证feature-map的大小固定(???)。相邻的两个dense blocks之间有一个过渡层,过渡层包括一个1x1的卷积后跟一个2x2的平均池化层。在最后一个dense block后,进行一个全局平均池化层,最后是一个softmax分类器。三个dense block的feature-map尺寸分别为32x32、16x16和8x8。实验中,分别采用,,三种策略,分别采用,,三种策略.
在ImgageNet数据集上,采用结构,包含4个dense blocks,输入图片为224x224像素,初始卷积层包含2k个7x7卷积,步长为2,增长率为32.如Table 1所示为ImgageNet上的结构。
论文在4个数据集上进行实验:CIFAR-10、CIFAR-100、SVHN和ImageNet。所有训练的网络都优化算法都使用SGD。在CIFAR和SVHN上训练的batch size为64,分别为300和40轮。初始学习率设置为0.1, 在总轮数的50%和75%处除以10。在ImageNet上训练的batch size为256,训练90轮。初始学习率设置为0.1,在30轮和60轮的时候减小10倍。Memory-efficient implementation of densenets中优化了DenseNet的存储。
Table2是在三个数据集(C10,C100,SVHN)上和其他算法的对比结果,右侧三列是错误率(%),加粗部分优于对比之的,蓝色部分是最优值,+表示标准数据(???),*表示作者自己跑的数据。从结果中我们可以看出,DenseNet-BC的网络参数比相同深度的DenseNet少了很多,参数减少除了可以节省内存,还能减少过拟合
TODO:结果先贴上来,待分析
DenseNet论文解读理解