Densely Connected Convolutional Networks,CVPR-2017-best paper之一(共两篇,另外一篇是apple关于GAN的paper),早在去年八月 DenseNets的paper就发布在arXiv上了。

就CNN的发展来说,2017注定被DenseNets给占了(12年开始,经典的CNN网络,AlexNet,VGG,GoogLenet系列,ResNet系列),除了AlexNet,VGG,GoogLenet,ResNet都是在传统CNN连接方式上做了一些改变,从而获得更好的效果。自ResNet(2015,ImageNet 冠军)之后,能通过对CNN连接连接方式上的改变而获得巨大反响的非DenseNet不可了,所以这篇paper还是很值得读的,而且!paper很通俗易懂!因为仅是在连接方式上进行了改变,完全没有太多公式,希望大家可以通过paper学习其idea,为什么要这连接会work。

扯远了,回归正题。paper结构完整,由浅入深,非常适合阅读。paper分6部分:

1.Introduction

2. Related Work

3. DenseNets

4. Experiments

5. Discussion

6. Conclusion

1. Introduction :

介绍CNN的发展,尤其是层数的发展,突破100层大关(英文学习: surpassed the 100-layer barrier);层数深导致的问题是 information and gradient 的vanish或者“washout”,gradient vanish是众所周知的啦,这个information “washout”是什么意思,至今我也没理解,但是DenseNet结构一大亮点就是解决 information flow这个问题。information flow会贯穿全文!

接着讲[11,13,17,33]分别是怎么解决 information flow问题的,最后指出这些工作的相同之处:they create short paths from early layers to later layers

而DenseNet就不一样了,DenseNet为了最大化 information flow, they connect all layers (with matching feature-map sizes) directly with each other。我的理解就是每一层与其余所有层都有连接关系,l层与之前的所有层是l层的输入,l层是后面所有层的输出,这样可以得到更好的information flow。在此还强调一点,DenseNet与ResNet不同的是,ResNet combine features through summation, ResNet 是把特征加起来,而DenseNet则是 concatenating,连接起来。

作者还发现 dense connections have a regularizing effect, which reduces overfitting我觉得这是一个彩蛋啊,这个思想可以作为一个idea进行研究,做点实验,说不定有新发现,想发paper的同学,你懂的,毕竟解决overfitting也是我们经常遇到的问题。

2. related work

由于DenseNet是针对结构(连接)上的改变,所以就介绍了一大部分关于network architectures

的paper,有需要的可以做相应研究。

3. DenseNets

这一部分才是重头戏,直接看DenseNet的网络结构图(一图胜千言):

【文献阅读】Densely Connected Convolutional Networks-best paper-CVPR-2017-LMLPHP

上边是整个网络示意图,是包含三个dense block的网络,而DenseNet中的Dense 主要体现在dense block里面,dense block又是什么鬼? 看图吧:【文献阅读】Densely Connected Convolutional Networks-best paper-CVPR-2017-LMLPHP

这是一个包含5层(含input)的dense block ,x表示层,分别有x0 至x4,H表示操作,这里面,H的操作有: BN+Relu+Conv ,block最后是一个transition layer。

(一开始我对DenseNet的理解没有block的概念,所有layer同等对待,当前layer会给后面所有layer作为输入,然后并不是的,当前layer仅仅给同一个dense block 里在其之后的layer作为输入)

看完结构图,只是有个大概了解,接下来就讲讲DenseNet中的东西,分别有以下六个部分:

1. Dense connectivity

为了improve the information flow between layers(information flow 是贯穿paper的主线!)作者提出 dense connectivity 。

首先明确,dense connectivity 仅仅是在一个dense block里的,不同dense block 之间是没有dense connectivity 的!dense connectivity 是什么意思呢? 我拿上图2中的操作H2来说,按照传统的连接方法,H2的输入仅是X1,而这里为了更好的让 information flow,H2的输入不仅是X1,而且还有X0,看下图中,红框部分:

【文献阅读】Densely Connected Convolutional Networks-best paper-CVPR-2017-LMLPHP

同理,H3的输入是X0, X1,X2,

2.Composite function

也就是上图中的H1 H2 H3 H4,这里的 操作是 BN,Relu,3*3 conv(padding=1,不改变feature map的尺寸)

3. Pooling layers

作者先承认pooling的作用很重要,然而在dense connectivity时,如果feature map的尺寸不一致,是没有办法connectivity的,而又不能丢弃pooling,那怎么办呢??一个dense block里不能改变feature map的尺寸,那就搞多一个dense block 就好啦!dense block之间用上pooling

作者如是说,To facilitate pooling,把网络分为了多个dense block,在一个dense block 结束,连接下一个dense block之前,需要经过一个叫做transition layers的层,如图1,图2中,红圈里面的那个。transition layers层里边包含了BN, 1*1Conv,pooling

4. Growth rate

考虑一个问题,假设每一个H操作就会产生k个feature maps,那么当层数为l的时候就会有k*(l-1)+k0 (k0是input的通道数,RGB的话,就是3),如果k太大,会导致数据量特别大(feature maps多嘛),而这个k又恰恰是卷积核的个数,所以也不能太大,太大了,网络的参数又太多。因此这里,作者增加了一个叫做 Growth rate的东西,令为k,如上图2中,最下边的注释就说可,k=4,看看 X1 X2 X3 X4里边就只有4个feature maps。

5. Bottleneck layers

为什么要用Bottleneck layers?因为作者觉得每层产生k个feature maps,还是很多啊,那怎么办?用1*1*n的卷来积呗,1*1*n来卷积,feature maps是n,也就是说,把原来为k个feature maps降到n个feature maps,大家都把这个过程叫做降维。(我是拒绝的,只能说单纯的从数字上,确实是减少了,但是和平时我们说的降维不是一回事啊!)

具体操作是在H当中的,例如 l层H是这样的一系列操作:

BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3)

如果带用了这个操作的模型,那么就记为 DenseNet-B

作者提到,在他们的实验中,这个n 取 为4倍的k,即 4*k

6. Compression

为了更compactness,作者就是嫌弃feature maps太多,既然在dense block里面用上了Bottleneck layers来减少feature maps数量了,还想在dense block外面也要减;前面说过,dense block之后先接一个 transition layers,那么在transition layers里也搞一个 reduce!而这个reduce是带参数的,也就是减少百分之多少,作者的实验中是减少50%,θ是 0.5

如果用了这个操作的,称之为 DenseNet-C;

如果 bottleneck layers 和compression一起用了,就称之为 DenseNet-BC

好了,至此,DenseNet中novel的东西就讲完了,剩下就是怎么把123456一起用起来,组装成一个强大的神经网络的问题了,至于具体怎么操作,看是看代码吧,这个样会更清晰!

总结一下:

  1. 全文主线是 information flow,为了更改好的 information flow,那就让information(feature maps)可以到达任意的地方,即Dense connectivity
  2. 为了减少模型参数,在dense block里面采用bottleneck layers(看着名字唬人,其实就是1*1*n的一个卷积操作,这个n=4k,把feature maps数量变到4k这么小)

    同时,在dense block 之后还要把feature maps数量减一减,就用了一个叫做compression的操作,其实就是把卷积核的数量设置为feature maps的 θ倍,这样就达到减少feature maps的目的

4,5,6部分其实都很精彩,会详细介绍如何训练网络,参数如何设定,这可是秘方啊,作者都给出来了,除了了解DenseNet之外,还想了解如何训练网络的,推荐看看paper4,5,6部分。

还有一点就是作者的源码(https://github.com/liuzhuang13/DenseNet)中,不仅给出了prototxt,连solver都给出来了!大家风范啊!

05-11 20:13