阅读《Densely Connected Convolutional Networks》的理解

Densely Connected Convolutional Networks


论文地址     作者 github地址

    这篇文章出自2017年的CVPR,提出了DenseNets的网络结构,该结构与High NetworksResNetsInception相比,更容易训练优化。该网络有四个优点:1、减轻了梯度消失问题;2、加强了特征的前向传播;3、重复利用特征;4、减少了参数量。作者在现有的四个很有挑战性的数据集(CIFAR-10CIFAR-100SVHNImageNet)上做了详细的对比实验,实验表明在目前的算法中,DenseNets不仅在精确度上取得了领先,而且需要的计算量更小。

    近几年,在卷积网络复苏后,很多研究人员尝试把网络结构做得很深来提升网络效果。但是当网络变深时,输入信息和梯度信息在传递很多层后会逐渐消失,使得网络整体达不到预期的效果。研究人员针对这个问题对深层卷积网络结构进行了调整,实验表明在深层的卷积网络之中加入短连接,网络将会变得更容易优化,精确度也会得到相应的提升。例如High NetworksResNets等采取的方式是建立恒等连接,整体效果在当时取得了领先的地位。DenseNets采取仍是建立短连接的方式,但是探究的不再是使网络变得更深或者更宽,而是发掘特征重利用(feature reuse)的潜力。该网络的结构如图(1)所示,即前面输出的每一个feature map都与后面的层相连,Xi表示的输入,H1的输入是x0,H2的输入是X0和X1,其中X1是H1的输出。传统的卷积网络有L层(除去输入层),则会有L个连接,但是该网络会有L(L+1)/2个连接。采取这种连接方式是为了让输入数据的信息和梯度信息能够在整个网络中充分流动,使得网络更容易训练。

阅读《Densely Connected Convolutional Networks》的理解_第1张图片

(1) 一个5层的dense block



           DenseNets的其中一个优点是参数更少,很大程度上是因为图(1)中的稠密连接方式。比如图(1)中的的H3输入为X0、X1和X2,在设计网络结构时,是将这三个输入连接成一个大的张量,于是每一层就不需要产生通道数很大的feature map,而传统的网络是在每一层卷积后生成大量的feature mapDenseNets的这种连接方式也就决定了它的参数量会更少。另外作者提到,这种稠密连接方式会有一个正则化的效果,有利于减弱少量训练数据集下的过拟合问题

    另外在ResNetsDenseNets间有一点需要明确,若X1表示的第l层的输入,Hl(.)表示一种非线性结构,那么ResNets的恒等映射可以用如下公式表示:

 

其优点是梯度可以通过恒等映射从后面的层流到前面的层。缺点是ResNets采取的是直接相加求和的方式,可能会影响梯度传递。

DenseNets采取的映射可以通过如下公式表示:

[X0,X1,…,Xl-1] 表示的是将第0 ,…, l-1 层的 feature map 进行连接。

         上面的Hl(.)表示的是一个组合函数,由BN层、ReLU层和3*3的卷积层构成。在对DenseNetsfeature map进行连接操作时,如果feature mapsize不一致,则连接操作不可进行,一般情况下采用的方式是对feature map进行下采样操作来改变size。为了简化这种操作,我们采用将网络划分为dense blocks的形式,如图(2)所示,图(1)表示的是其中一个block。在每一个block中,feature map的维度一样,稠密连接也只是在每一个block中进行。将两个block之间的层当做过度层(transition layers),由BN层、卷积层和平均池化层构成。

阅读《Densely Connected Convolutional Networks》的理解_第2张图片

图(2)


    在一个block中,如果Hl产生kfeature maps,那么第l层的输入有k0+k*(l+1)个feature maps,k0表示的是输入层的通道数。这里的k当做超参数growth rate,可以只取12,实验证明很小的k值也能取得很好的效果。可以留意到,当层数较多时。第l层的输入feature map的数量将会很大,可以采取1*1的卷积来改变通道数,这种方式对DenseNets也是很有效的,在DenseNets-B中设计了一个Bottleneck layers来解决这种情况。同时为了进一步提高模型的紧凑性,可以在过度层(transition layers)减少feature maps的数量来进行压缩,默认通过过度层后通道数减少一半,采取了这种结构的网络被称为DenseNets-C

    关于bottleneck layerstransition layer操作。在每个Dense Block中都包含很多个子结构,以图(3)中的DenseNet-169Dense Block3)为例,包含321*13*3的卷积操作,也就是第32个子结构的输入是前面31层的输出结果,每层输出的channel32growth rate),那么如果不做bottleneck操作,第32层的3*3卷积操作的输入就是31*32+(上一个Dense Block的输出channel),近1000了。而加上1*1的卷积,代码中的1*1卷积的channelgrowth rate*4,也就是128,然后再作为3*3卷积的输入。这就大大减少了计算量,这就是bottleneck。至于transition layer,放在两个Dense Block中间,是因为每个Dense Block结束后的输出channel个数很多,需要用1*1的卷积核来降维。还是以DenseNet-169Dense Block3)为例,虽然第32层的3*3卷积输出channel只有32个(growth rate),但是紧接着还会像前面几层一样有通道的concat操作,即将第32层的输出和第32层的输入做concat,前面说过第32层的输入是1000左右的channel,所以最后每个Dense Block的输出也是1000多的channel。因此这个transition layer有个参数reduction(范围是01),表示将这些输出缩小到原来的多少倍,默认是0.5,这样传给下一个Dense Block的时候channel数量就会减少一半,这就是transition layer的作用。文中还用到dropout操作来随机减少分支,避免过拟合,毕竟这篇文章的连接确实多。(这段话摘自链接)

阅读《Densely Connected Convolutional Networks》的理解_第3张图片

图(3)


实验结果

阅读《Densely Connected Convolutional Networks》的理解_第4张图片

    上图是在CIFAR-10CIFAR-100SVHN数据集上做的实验,网络只采取了3dense block。可以看到DenseNets的效果比其他网络都要好,而且参数量更小。在ImageNet上的实验结果如下图所示,在ImageNet上的实验用到了4dense block

    下图中的Figure3表示的是DenseNetsResNets的对比,可以看到DenseNets的明显优势。

阅读《Densely Connected Convolutional Networks》的理解_第5张图片阅读《Densely Connected Convolutional Networks》的理解_第6张图片





你可能感兴趣的:(深度学习)