论文笔记 - DenseNet 密集网络

DenseNet

参考资料

Densely Connected Convolutional Networks
史上最全!历年 CVPR 最佳论文盘点(2000 年——2018 年)
卷积神经网络中用1*1 卷积有什么作用或者好处呢?
pytorch-cifar10-notebook

引言

DenseNet就是每层的输入都是前几层输出的总和,而不是简单的上一层的输出。

DensetNet的优点

  1. 缓和了梯度消失的问题;
  2. 增强了特征的传播,鼓励特征重用;
  3. 减少了参数量。

解决的问题

背景问题

深度卷积网络输入或梯度的信息,可能经过很多很多层之后,就会消失或被清除(wash out)。

ResNet和HighwayNet都使用了额外的连接来解决信息或梯度的传递问题。

而Stochastic depth网络通过在训练的时候随机丢弃掉某些层,来解决信息、梯度的传递问题。

它们都有一个共同点:在网络的前层和后层都创建了通路。

解决思路

DenseNet就将每层的信息都往后连,确保信息和梯度能够最大化的流向后面的层中。

而连接的方式只是简单的对每层输出进行concat而不是add(在channel维度叠加)(这点和ResNet是不一样的)。

concat的好处

  1. 更少的参数,无需重复学习冗余的feature-map(ResNet每层有都自己单独的权值,例如out_channels=512时就有512个filter,而DenseNet可能只有12个,因为输出中有很大一部分信息来自前面几层的feature-map);
  2. 让信息和梯度能够更好的流动,因为在反向传播时,每层都能够直接访问损失值和原始输入,从而导致了“深度监督”(deep supervision),从而更好的训练深层网络;
  3. dense connections有着正则化的效果,当训练集较小时能够减缓过拟合。

相关的工作

启发点

  • 由Stochastic depth网络(训练时随机丢弃层)中可以发现,深度网络中存在很大的冗余;
  • 由GoogLeNet的Inception得到的启发:将feature-map通过concat的方式相连;
  • 由ResNet得到的启发:ResNet可以通过简单地提高每层的filter数量来提高性能。

DenseNet比Inception更简单高效,且1x1的卷积核能够提取更加复杂的特征。

DenseNet理论

Demo
Architecture

DenseNet的参数:Growth rate

第L层的输入,有k0 + k * (L-1)个feature-map,k0代表输入层自己的维数,k代表增长率,也就是每层自己的filter数。

实验表明,相对小的增长率就能取得较好的结果。

collective knowledge

每层的输出相当于全局信息,所有人都能够访问。

Bottleneck Layers

和ResNet一样,当网络层数加深时,就需要使用这种结构来减少参数量,让1x1的卷积输出4k个feature-map。

Compression

为了使网络更紧密,作者还对每个Dense Block的输出进行了维数压缩。

具体做法就是在transition layer做的,θm向下取整,θ取值0-1,作者在论文中取的是0.5。

举例:当θ取1时,上层Dense Block过来后,输出的维数不变,当θ取0.5时,输出维数减半。

实验结果

Error rates on CIFAR10 and SVHN datasets

训练

在CIFAR上:

  • epoch=300
  • batch_size=64
  • learning_rate=0.1 (divided by 10 at 50% and 75% of the epoches)

在ImageNet上:

  • epoch=90
  • batch_size=256
  • learning_rate=0.1 (divided by 10 at epoch 30 and 60)

其他参数:

  • weight_decay=1e-4
  • momentum=0.9
  • weight_initialization: kaiming_norm

在实际训练的时候,遇到了一点问题,就是GPU的占用率上不来,还在查找原因。