DenseNet论文解读理解

论文名称:Densely Connected Convolutional Networks
论文链接:https://arxiv.org/pdf/1608.06993.pdf
代码的github链接:https://github.com/liuzhuang13/DenseNet


DenseNet

作者在开头讲述了诸如ResNets、FractalNets、Highway等网络,并总结了一句话:they
create short paths from early layers to later layers. 意思就是说,像这种很深的网络,保持梯度不消失,或者减少消失,是通过这种前层和后层直连的方式进行的。所以,作者在本文中提出了这个叫做DenseNet的网络。

对比ResNets,作者没有把通过一个层的特征进行求和,而是通过连接的方式把每一层的特征连接起来,就像一个list,每经过一层进行一次append。所以当经过l 层时,第l 层有l 个输入,所以对于一个l 层的网络,一共有L(L+1)2 个连接。

DenseNet网络结构图:
这里写图片描述
这里写图片描述

相较于传统卷积网络
1)DenseNet有更少的网络参数,网络更窄
2)这种结构更有利于信息的传递,以及进行反向传播的时候,更有利于减轻梯度消失的情况

DenseNet和ResNets两个网络最直观的描述:

ResNets: Xl=Hl(Xl1)+Xl1
DenseNets: Xl=Hl([X0,X1,X2,...,Xl1])

我们可以看出Res是对上一次输入的数据(上上次Transformation的结果)和其Transformation进行整合,而Dense是对本层之前的每一次输入进行concatenation,并整体进行Transformation,这样操作对误差反向传播更好找到来源,更好的调整参数。

这里写图片描述

这个Table1就是整个网络的结构图。这个表中的k表示每个dense block中每层输出的feature map个数为了避免网络变得很宽,作者都是采用较小的k,比如32这样,作者的实验也表明小的k可以有更好的效果。根据dense block的设计,后面几层可以得到前面所有层的输入,因此concat后的输入channel还是比较大的。另外这里每个dense block的3*3卷积前面都包含了一个1*1的卷积操作,就是所谓的bottleneck layer,目的是减少输入的feature map数量,既能降维减少计算量,又能融合各个通道的特征,何乐而不为。另外作者为了进一步压缩参数,在每两个dense block之间又增加了1*1的卷积操作。因此在后面的实验对比中,如果你看到DenseNet-C这个网络,表示增加了这个Translation layer,该层的1*1卷积的输出channel默认是输入channel到一半。如果你看到DenseNet-BC这个网络,表示既有bottleneck layer,又有Translation layer。

再详细说下bottleneck和transition layer操作。在每个Dense Block中都包含很多个子结构,以DenseNet-169的Dense Block(3)为例,包含32个1*1和3*3的卷积操作,也就是第32个子结构的输入是前面31层的输出结果,每层输出的channel是32(growth rate),那么如果不做bottleneck操作,第32层的3*3卷积操作的输入就是31*32+(上一个Dense Block的输出channel),近1000了。而加上1*1的卷积,代码中的1*1卷积的channel是growth rate*4,也就是128,然后再作为3*3卷积的输入。相比于1000,这就大大减少了计算量,这就是bottleneck思想。至于transition layer,放在两个Dense Block中间,是因为每个Dense Block结束后的输出channel个数很多,需要用1*1的卷积核来降维。还是以DenseNet-169的Dense Block(3)为例,虽然第32层的3*3卷积输出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操作来随机减少分支,避免过拟合,毕竟这篇文章的连接确实多。

作者在4个数据集上进行实验:CIFAR-10、CIFAR-100、SVHN和ImageNet

这里写图片描述

Table2是在三个数据集(C10,C100,SVHN)上和其他算法的对比结果。DenseNet-BC的网络参数和相同深度的DenseNet相比确实减少了很多!参数减少除了可以节省内存,还能减少过拟合。这里对于SVHN数据集,DenseNet-BC的结果并没有DenseNet(k=24)的效果好,作者认为原因主要是SVHN这个数据集相对简单,更深的模型容易过拟合。在表格的倒数第二个区域的三个不同深度L和k的DenseNet的对比可以看出随着L和k的增加,模型的效果是更好的。

这里写图片描述
Figure3是DenseNet-BC和ResNet在Imagenet数据集上的对比,左边那个图是参数复杂度和错误率的对比,你可以在相同错误率下看参数复杂度,也可以在相同参数复杂度下看错误率,提升还是很明显的!右边是flops(可以理解为计算复杂度)和错误率的对比,同样有效果。
这里写图片描述
Figure4也很重要。左边的图表示不同类型DenseNet的参数和error对比。中间的图表示DenseNet-BC和ResNet在参数和error的对比,相同error下,DenseNet-BC的参数复杂度要小很多。右边的图也是表达DenseNet-BC-100只需要很少的参数就能达到和ResNet-1001相同的结果。

该文章提出的DenseNet核心思想在于建立了不同层之间的连接关系,充分利用了feature,进一步减轻了梯度消失问题,加深网络不是问题,而且训练效果非常好。另外,利用bottleneck layer,Translation layer以及较小的growth rate使得网络变窄,参数减少,有效抑制了过拟合,同时计算量也减少了。DenseNet优点很多,而且在和ResNet的对比中优势还是非常明显的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章