《Densely Connected Convolutional Networks》阅读笔记

《Densely Connected Convolutional Networks》阅读笔记

代码地址:https://github.com/liuzhuang13/DenseNet

首先看一张图: 
这里写图片描述 
稠密连接:每层以之前层的输出为输入,对于有L层的传统网络,一共有 L [Math Processing Error]个连接,对于DenseNet,则有 L(L+1)2 [Math Processing Error]

这篇论文主要参考了Highway Networks,Residual Networks (ResNets)以及GoogLeNet,通过加深网络结构,提升分类结果。加深网络结构首先需要解决的是梯度消失问题,解决方案是:尽量缩短前层和后层之间的连接。比如上图中, H4 [Math Processing Error]层可以直接用到原始输入信息 X0 [Math Processing Error],同时还用到了之前层对 X0 [Math Processing Error]处理后的信息,这样能够最大化信息的流动。反向传播过程中, X0 [Math Processing Error]的梯度信息包含了损失函数直接对 X0 [Math Processing Error]的导数,有利于梯度传播。 
DenseNet有如下优点: 
1.有效解决梯度消失问题 
2.强化特征传播 
3.支持特征重用 
4.大幅度减少参数数量

接着说下论文中一直提到的Identity function: 
很简单 就是输出等于输入 f(x)=x [Math Processing Error] 
这里写图片描述

传统的前馈网络结构可以看成处理网络状态(特征图?)的算法,状态从层之间传递,每个层从之前层读入状态,然后写入之后层,可能会改变状态,也会保持传递不变的信息。ResNet是通过Identity transformations来明确传递这种不变信息。

网络结构: 
这里写图片描述
每层实现了一组非线性变换 Hl(.) [Math Processing Error],可以是Batch Normalization (BN) ,rectified linear units (ReLU) , Pooling , or Convolution (Conv). 第 l [Math Processing Error]层的输出为 xl [Math Processing Error]。 
对于ResNet: 

xl=Hl(xl1)+xl1
[Math Processing Error]  
这样做的好处是the gradient flows directly through the identity function from later layers to the earlier layers. 
同时呢,由于identity function 和 H的输出通过相加的方式结合,会妨碍信息在整个网络的传播。

受GooLeNet的启发,DenseNet通过串联的方式结合: 

xl=Hl([x0,x1,...,xl1])
[Math Processing Error]

这里 Hl(.) [Math Processing Error]是一个Composite function,是三个操作的组合: BN>ReLU>Conv(3×3) [Math Processing Error]

由于串联操作要求特征图 x0,x1,...,xl1 [Math Processing Error]大小一致,而Pooling操作会改变特征图的大小,又不可或缺,于是就有了上图中的分块想法,其实这个想法类似于VGG模型中的“卷积栈”的做法。论文中称每个块为DenseBlock。每个DenseBlock的之间层称为transition layers,由 BN>Conv(1×1)>averagePooling(2×2) [Math Processing Error]组成。

Growth rate:由于每个层的输入是所有之前层输出的连接,因此每个层的输出不需要像传统网络一样多。这里 Hl(.) [Math Processing Error]的输出的特征图的数量都为 k [Math Processing Error] k [Math Processing Error]即为Growth Rate,用来控制网络的“宽度”(特征图的通道数).比如说第 l [Math Processing Error]层有 k(l1)+k0 [Math Processing Error]的输入特征图, k0 [Math Processing Error]是输入图片的通道数。

虽然说每个层只产生 k [Math Processing Error]个输出,但是后面层的输入依然会很多,因此引入了Bottleneck layers 。本质上是引入1x1的卷积层来减少输入的数量, Hl [Math Processing Error]的具体表示如下

BN>ReLU>Conv(1×1)>BN>ReLU>Conv(3×3)
[Math Processing Error]  
文中将带有Bottleneck layers的网络结构称为DenseNet-B。

除了在DenseBlock内部减少特征图的数量,还可以在transition layers中来进一步Compression。如果一个DenseNet有m个特征图的输出,则transition layer产生  θm [Math Processing Error]个输出,其中 0<θ1 [Math Processing Error]。对于含有该操作的网络结构称为DenseNet-C。

同时包含Bottleneck layer和Compression的网络结构为DenseNet-BC。 
具体的网络结构:

这里写图片描述

实验以及一些结论 
在CIFAR和SVHN上的分类结果(错误率): 
这里写图片描述
L [Math Processing Error]表示网络深度, k [Math Processing Error]为增长率。蓝色字体表示最优结果,+表示对原数据库进行data augmentation。可以发现DenseNet相比ResNet可以取得更低的错误率,并且使用了更少的参数。 
接着看一组对比图: 
这里写图片描述
前两组描述分类错误率与参数量的对比,从第二幅可以看出,在取得相同分类精度的情况下,DenseNet-BC比ResNet少了 23 [Math Processing Error]的参数。第三幅图描述含有10M参数的1001层的ResNet与只有0.8M的100层的DenseNet的训练曲线图。可以发现ResNet可以收敛到更小的loss值,但是最终的test error与DenseNet相差无几。再次说明了DenseNet参数效率(Parameter Efficiency)很高!

同样的在ImageNet上的分类结果: 
这里写图片描述
右图使用FLOPS来说明计算量。通过比较ResNet-50,DenseNet-201,ResNet-101,说明计算量方面,DenseNet结果更好。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值