论文链接:https://arxiv.org/pdf/1608.06993.pdf
代码链接:https://github.com/liuzhuang13/DenseNet
目前的工作表明如果将接近输入和输出的层之间短接,卷积神经网络可以更深、精度更高且高效。在本篇论文中,我们利用到观察到的这个结果提出了密集卷积网络(DenseNet),它的每一层在前向反馈模式中都和后面的层有连接,与L层传统卷积神经网络有L个连接不同,DenseNet中每个层都和其之后的层有连接,因此L层的DenseNet有 L(L+1)/2 个连接关系。对于每一层,它的输入包括前一层的输出和该层之前所有层的输入。DenseNets有几个引入注目的优势:
我们在四个目标识别的基准测试集(CIFAR-10、CIFAR-100、SVHN 和 ImageNet)上评估了我们的结构,可以发现DenseNet在减少计算量的同时取得了更好的表现。
当CNN网络的深度持续增加时,一个新的研究问题就会出现:输入部分的信息流或者梯度在经过很多层之后,当到达网络结束(或开始)的地方时会消失。关于这个问题的研究有很多,可以发现的是虽然在网络拓扑和训练时方法各异,但是它们都有一个关键的特征:即前层和后层之间有短接。
在这篇文章中,遵从上面的直觉并提出了一种简单的连接模式:可以最大化网络中各层之间的信息流动,我们将所有层之间都相互连接,为了保留前向的特征,每个层都会获得前层的额外输入并将本层的特征传递给后续的层。Figure 1展示了这个关系,与ResNets相比,我们没有对上一层的输入和上一层的输出进行特征融合后再送入下一层,而是将前面所有层的特征图它们进行拼接。因此,第l层有l个输入,它由前面卷积层的特征图构成,并且本层的特征图也会传递给后续的L-l个层,所以一个L层的网络总共会有 L(L+1)/2 个连接,而不是传统结构的L个。
x0作为整个网络结构的输入,网络由L层组成,每一层的运算用一个非线性转换Hl()表示,这里的l表示第几层。Hl()可以看成由BN、ReLU、池化、卷积操作定义的复合运算。同时将第l层的输出定义为xl。
ResNets.
传统的卷积神经网络中,第l层的输入为第l-1层的输出,第l层的输出为:
ResNets添加了旁路支路:
ResNets的优势是梯度可以直接通过恒等映射从后面的层传到前层来,然而,恒等映射 和 Hl的输出通过叠加结合在一起,这一定程度上阻碍了网络中的信息流。
Dense connectivity
[x0,x1,…,x(l-1)]是将第0、1、…、l-1层的feature map拼接在一起。
Composite function
这里的Hl()可以看成是由BN、ReLU、3x3卷积的组合运算。
Pooling layers
当特征图的尺寸发生变化时,等式(2)中的拼接操作是不可行的,然而,卷积网络的一个重要部分就是通过下采样改变特征图的尺寸。为了在我们的网络结构中做下采样,我们将网络划分为多个密集连接卷积网络块,如Figure 2所示,我们将块之间的层看作转换层,它是由BN、1x1卷积层、池化层构成,目的是做卷积和池化。
Growth rate
如果每一个Hl都产生k个feature map,那么第l个层就会有 k0 + k x (l - 1) 个输入的feature map,k0表示输入层的通道数,DenseNet和已经存在的网络结构中一个重要区别是DenseNet的通道数很窄,比如k=12,我们将超参数k定义为网络的growth rate,在后面的分析中我们会看到小的growth rate对于在测试集上获得很好的表现也是足够的。一个解释就是每一层都可以访问块中前面层,因此,可以理解为网络的“集体认识”,可以把网络的特征图看作是全局变量,每过一个层,就往全局变量中添加k个特征图。
Bottleneck layers
尽管每个层的输出都只有k个通道,但是它的输入通道数很大。可以在 3x3 的卷积层之前使用 1x1 的瓶颈层来提高计算效率,我们发现这样的设计非常高效,一个 bottleneck层代指 BN-ReLU-Conv(1x1)-BN-ReLU-Conv(3x3),这样的网络结构称为 DenseNet-B。在我们的实验中,1x1 的卷积层的输出通道为 4k。
Compression
为了使模型更加紧密,我们通过transition层减少特征图的数量。如果一个dense block包含m个特征图,那么通过transition层会产生 theta * m(下取整)个输出feature map,在这里 0 Implementation Details 在除了ImageNet之外的数据集上,实验中的DenseNet都用了三个dense block(ImageNet用了四个块),每个块总包含有相同数量的层。其他的具体细节可以参考论文第三节中的Implementation Details部分。 在ImageNet数据集上,我们使用了带有四个dense block的DenseNet-BC结构,输入图片尺寸为224x224。最开始的卷积层为2k个7x7x输入图片通道数的卷积核,步长为2;所有层的feature-maps的数量也都由k设置,对ImageNet使用的网络配置如table1所示: 再详细说下bottleneck和transition layer操作。在每个Dense Block中都包含很多个子结构,以DenseNet-169的Dense Block(3)为例,包含32个11和33的卷积操作,也就是第32个子结构的输入是前面31层的输出结果,每层输出的channel是32(growth rate),那么如果不做bottleneck操作,第32层的33卷积操作的输入就是3132+(上一个Transition Layer的输出channel),近1000了。而加上11的卷积,代码中的11卷积的channel是growth rate4,也就是128,然后再作为33卷积的输入。这就大大减少了计算量,这就是bottleneck。至于transition layer,放在两个Dense Block中间,是因为每个Dense Block结束后的输出channel个数很多,需要用11的卷积核来降维。还是以DenseNet-169的Dense Block(3)为例,虽然第32层的33卷积输出channel只有32个(growth rate),但是紧接着还会像前面几层一样有通道的concat操作,即将第32层的输出和第32层的输入做concat,前面说过第32层的输入是1000左右的channel,所以最后每个Dense Block的输出也是1000多的channel。因此这个transition layer有个参数reduction(范围是0到1),表示将这些输出缩小到原来的多少倍,默认是0.5,这样传给下一个Dense Block的时候channel数量就会减少一半,这就是transition layer的作用。文中还用到dropout操作来随机减少分支,避免过拟合,毕竟这篇文章的连接确实多。 我们设计实验在几个基准测试集上验证了DenseNet的有效性,并着重与ResNet 和它的几个变体做了比较。 训练的具体细节: Classification Results on CIFAR and SVHN Table2是在三个数据集(C10,C100,SVHN)上和其他算法的对比结果。ResNet[11]就是kaiming He的论文,对比结果一目了然。DenseNet-BC的网络参数和相同深度的DenseNet相比确实减少了很多!参数减少除了可以节省内存,还能减少过拟合。这里对于SVHN数据集,DenseNet-BC的结果并没有DenseNet(k=24)的效果好,作者认为原因主要是SVHN这个数据集相对简单,更深的模型容易过拟合。在表格的倒数第二个区域的三个不同深度L和k的DenseNet的对比可以看出随着L和k的增加,模型的效果是更好的。 Classification Results on ImageNet DenseNets与ResNets相比的区别仅在于等式(2)和等式(3)所描述的Hl()的不同,然而,这一点微小的修正直接导致了两种结构不同的表现。 Model compactness DenseNet高性能的一种解释就是每一层都会接受到通过shorten connections引入的来自损失函数的额外监督。 Stochastic vs. deterministic connection 在DenseNet和stochastic depth regularization之间存在着一种有趣的联系,在stochastic depth中,残差块中的层可以随意丢弃,这使得周围层之间可能直接相连。但是池化层从未丢弃,这看起来有些和DenseNet类似,尽管两者的方法不同,但我们可以从stochastic depth的角度理解DenseNet——引入了正则化的意味。 Feature Reuse DenseNet允许本层访问之前所有层的feature maps,我们设计了一组实验来验证了这个想法,在C10+数据集上L=40、k=12,对于一个块内的l层,我们计算和它相连接的s层的权重平均值的绝对值,Figure 5展示了三个dense块的热力图,权重平均值绝对值展示了这一层对之前某一层特征的复用率。 https://blog.csdn.net/weixin_41923961/article/details/82940854
DenseNet-121是指网络总共有121层:(6+12+24+16)*2 + 3(transition layer) + 1(7x7 Conv) + 1(Classification layer) = 121;Experiments
Training
Discussion
Implicit Deep Supervision
可以发现:
基于tensorflow的DenseNet实现: