Densely Connected Convolutional Networks 学习笔记

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有如下几个显著优点:

  1. 减轻梯度消失
  2. 加强特征传递 
  3. 特征重用
  4. 减少参数量

       论文以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。所以当经过l层时,第l层有l个输入,所以对于一个l层的网络,一共有\frac{L(L+2)}{2}个连接。

        DenseNet看起来会比传统CNN参数多,事实上要更少,因为重新学习冗余的特征图的过程。传统前馈结构是一种带状态的算法,这种状态层层传递,改变状态的同时传递了有效信息。ResNets通过恒等变换(identity transformations)保留信息,ResNets的新变体中发现,很多层的贡献并不大,可以在学习工程中被随机丢弃。这让ResNets的状态机制和展开的RNN相似(参考文献13,看一下这篇),但因为ResNets每层都有权重所以参数量巨大。论文提出DenseNet结构名明确的将作为添加的信息和需要保留的信息区开,DenseNet层非常窄(例如,每层只有12个滤波器),仅向网路的collective knowledge中添加一小部分feature-maps并保持其余的feature-maps保持不变,最终的分类器基于网络中所有的feature-maps进行决策。

      DenseNet的另一优点是整个网络中改进的信息流和梯度流,这使得它们更容易训练。每一层都能直接从损失函数和原始输入信号中获得梯度,有助于更深层次网络的训练。此外,密集连接能起到正则化的作用,可以减小在小规模数据集上过拟合。

DenseNets

       假设一个卷积网络的单张输入图片X_{0},该网络包含L层,每个层实现一个非线性转换H_{l}(\cdot )l表示层号,H_{l}(\cdot )可以是操作的复合函数,比如Batch Normalization(BN)、整流线性单元(ReLU)、池化层和卷积层。我们将第l层的输出定义为x_{l}

ResNets

      传统CNN:l层的输入为l-1的输出,即 x_{l}=H_{l}(x_{l-1})

      Resnet: 通过跳跃连接绕过了部分非线性变换,即 x_{l}=H_{l}(x_{l-1}) +x_{l-1}

      ResNet的一个优点就是梯度可以直接通过identity function从后面的层流到较前面的层。但是,identity function和输出H_{l}通过汇合的方式结合可能会阻碍网络中的信息流(?不是特别明白)。

Dense connectivity

     论文提出了提升信息流的新模型,每一层向其后所有层直接连接,如图1所示,l层的输入为0 \cdot \cdot \cdot l-1的输出,即

                                                             x_{l}=H_{l}([x_{0},x_{1},\cdot \cdot \cdot ,x_{l-1}])   

     其中[x_{0},x_{1},\cdot \cdot \cdot ,x_{l-1}]表示0 \cdot \cdot \cdot l-1层的特征图,便于应用,我们将H_{l}()的输入连成一个张量。

Composite function

     H_{l}(\cdot )是个复合函数,由三部分组成,分别是batch normalization,ReLU和一个3*3卷积。

Pooling layers

       当feature-maps的尺寸发生变化时,以上公式中的连接操作不可行。但是,卷积神经网络中可以采用下采样调整feature-maps的尺寸。将网络分为多个紧密相连的dense block以便进行下采样,如图2所示。我们将块之间的层称为过渡层,它们进行卷积和池化操作。我们实验中使用的过渡层包括一个BN层和一个1x1的卷积层,其次是一个2x2的平均池化层。

Growth rate

        如果每个H_{l}()产生k个feature-map,第l层会有k_{0}+k*(l-1)个feature-maps,k_{0}是输入层的通道数,k是层数。DenseNet的特征之一是层数少,k是模型中的超参,视k为增长率。实验证明小增长率即可获得较好的结果。dense block中的每一层都可以获得前面层的所有feature-map,因此,可以访问网络的collective knowledge。每一层都可以将feature-map视作网络的全局状态,同时又将自己的k个feature-map添加到全局状态。增长率k决定了每层共享多少feature-map给全局状态。全局状态一经写入,可以从各个层读取。区别与传统网络结构,需要层层复制。

Bottleneck layers

       虽然每层输出k个feature-map,但它的输入很多。在每个3x3卷积前引入1x1卷积作为bottleneck layer可以减少输入特征图的数量,提高计算效率。在实验中,DenseNet-B指采用bottleneck layer的实验组,我们让每个1x1卷积处理4k个feature-map(?看下4k怎么算出来的)

Compression

        为了进一步提高模型的紧凑性,我们在过渡层减少feature-maps的数量。如果一个dense block包含m个特征图,我们让其后的过渡层输出\left \lfloor \theta m \right \rfloor个feature-maps,其中\theta表示压缩率,0<\theta <1,当\theta =1时经过过渡层的feature-maps不做任何变化,我们的实验中设定\theta =0.5DenseNet-C指进行的压缩的实验组,DenseNet-BC指即采用bottleneck layer又进行压缩的实验组。

Implementation Details

       除ImgageNet外的所有数据集,DenseNet都有3个dense blocks,每个块的层数都是相等的。在进入第一个dense block前,对输入图像上进行一次16通道的卷积(或进行双倍增长率的DenseNet-BC??)。在卷积核大小为3x3的卷积层中,边缘填充1个像素的零值,以保证feature-map的大小固定(???)。相邻的两个dense blocks之间有一个过渡层,过渡层包括一个1x1的卷积后跟一个2x2的平均池化层。在最后一个dense block后,进行一个全局平均池化层,最后是一个softmax分类器。三个dense block的feature-map尺寸分别为32x32、16x16和8x8。实验中,DenseNet分别采用{L=40,K=12}{L=100,K=12}{L=100,K=24}三种策略,DenseNet-BC分别采用{L=100,K=12}{L=250,K=24}{L=190,K=40}三种策略.

      在ImgageNet数据集上,采用DenseNet-BC结构,包含4个dense blocks,输入图片为224x224像素,初始卷积层包含2k个7x7卷积,步长为2,增长率k为32.如Table 1所示为ImgageNet上的DenseNet结构。

实验

     论文在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:结果先贴上来,待分析

参考:

  1. DenseNet:比ResNet更优的CNN模型
  2. DenseNet论文解读理解

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值