DenseNet详解及Keras复现代码

原作者开源代码:https://github.com/liuzhuang13/DenseNet

论文:https://arxiv.org/pdf/1608.06993.pdf

1、DenseNet

随着卷积神经网络变得越来越深,一个新的问题出现了:当输入或梯度信息在经过很多层的传递之后,在到达网络的最后(或开始)可能会消失或者“被冲刷掉”(wash out)。DenseNet(Dense Convolutional Network)主要还是和ResNet和随机深度网络做对比,借鉴了跨层连接和随机丢弃层的思想,但却是不一样的结构,网络结构并不复杂,却非常有效!

DenseNet有如下几个优点:

  1. 缓解梯度消失
  2. 加强特征的传播,更高效利用参数,减少过拟合
  3. 特征重用
  4. 减少了参数量

下图是Dense Block的一个标准结构。

在这里插入图片描述

与ResNet类似的是,DenseNet也有跨层连接,而且它的跨层连接更多。

但不同的是,ResNet采用的连接方式是直接相加(Add):
X l = H l ( x l − 1 ) + X l − 1 X_l = H_l(x_{l-1}) + X_{l-1} Xl=Hl(xl1)+Xl1

而DenseNet则是拼接操作(Concatenation)
X l = H l ( [ X 0 , X 1 , . . . , X l − 1 ] ) X_l = H_l([X_0,X_1,...,X_{l-1}]) Xl=Hl([X0,X1,...,Xl1])
这也是DenseNet论文非常好的一个地方,没有过多的数学公式,连我这样的小白都能看得懂。

2、实现细节

Composite function

在dense block中,一个标准的符复合函数由三部分构成:BN -> Activation(ReLU) -> 3x3Conv

Pooling layers

当特征图的尺寸改变时,直接拼接操作的就会出现问题。然而,卷积网络有一个基础的部分——下采样层(transition layers),它可以改变特征图的尺寸。每个下采样层都是由1x1的卷积和2x2的平均池化组成。为了便于下采样的实现,我们将网络划分为多个dense block,如下图所示。

在这里插入图片描述

Growth rate

在dense block中,如果每层网络的输出都产生 k k k个feature maps,那么第 l l l的输入则有 k 0 + k ∗ ( l − 1 ) k_0+k*(l-1) k0+k(l1)个feature maps。其中 k 0 k_0 k0是输入层的通道数。所以 k k k在代码中就是卷积核的通道数。而在论文中实验证明小增长率 k k k,有更好的结果。对这种情况的一种解释是,每一层都可以和它所在的block中之前的所有特征图进行连接,使得网络具有了“集体知识”。可以将特征图看作是网络的全局状态。每一层相当于是对当前状态增加 k k k个特征图。增长速率控制着每一层有多少信息对全局状态有效。全局状态一旦被写定,就可以在网络中的任何地方被调用,而不用像传统的网络结构那样层与层之间的不断重复。

Bottleneck layers

根据dense block的设计,后面几层可以得到前面所有层的输入,concat后的输入还是比较大的,所以越到后面输入层就越大。作者就在3x3的卷积前,添加一个1x1的卷积操作,目的就是为了降低输入的feature map数量。这样就可以减少计算量了。

Compression

尽管在每个dense block内,采用了bottleneck结构来减少参数和计算量。但输入特征经过一个dense block输出后,feature maps叠加起来后还是很大。所以为了控制dense block之间特征的feature maps数量,进一步引入了 θ \theta θ参数( 0 < θ ≤ 1 0<\theta\leq1 0<θ1),当 θ = 1 \theta=1 θ=1时,网络则不变。作者根据实验结果建议 θ = 0.5 \theta=0.5 θ=0.5

如果只使用了Bottleneck结构,则称网络为DenseNet-B,如果既使用了Bottleneck也使用了Compression结构,则称网络为DenseNet-BC。

在这里插入图片描述

DenseNet的常用结构如上图所示,建议k的值为32。

3、实验结果

作者在多个benchmark数据集上训练了多种DenseNet模型,并与state-of-art的模型(主要是ResNet和其变种)进行对比:

在这里插入图片描述

由上表我们可以看出,DenseNet只需要较小的Growth rate(12,24)便可以实现state-of-art的性能。结合了Bottleneck和Compression的DenseNet-BC具有远小于ResNet及其变种的参数数量,且无论DenseNet或者DenseNet-BC,都在原始数据集和增广数据集上实现了超越ResNet的性能。

4、总结分析

模型的特征相关性强

将输入进行concat的直接结果是,DenseNets每一层学到的特征图都可以被以后的任一层利用。该方式有助于网络特征的重复利用,也因此得到了更简化的模型。DenseNet-BC仅仅用了大概ResNets 1/3的参数量就获得了相近的准确率。

隐含的深度监督

由于DenseNet更短的连接特性,每一层都可以直接从损失函数中获得监督信息。相当于该网络在每一隐藏层都加了分类器,迫使中间层也学习判断特征。

随机和固定的连接

DenseNet与随机深度网络也有着相似之处。由于随机丢弃某一层,使得网络中任意两个层都有可能短接。尽管DenseNet是一种固定的连接。这两个方法在根本上是完全不一样的,但在效果都是加强了特征间的复合,前面的特征得以在后面重用。

缺点

DenseNet也有相应的缺点,由于不断的拼接操作,也导致过多的重复梯度信息。当然后续也有人对此进行了研究。

代码复现

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值