tensorflow下实现DenseNet对数据集cifar-10的图像分类

DenseNet论文地址:https://arxiv.org/pdf/1608.06993.pdf

ResNet传送门:ResNet-cifar10

SegNet传送门:semantic segmentation SegNet

Inception v3传送门:inception v3

    这篇文章为2017CVPR的论文,DenseNet描述了一个全新的卷积层与卷积层的连接方式。与inception 的加宽网络结构以及ResNet的加深网络结构不同,DenseNet着重于对每一层feature maps的重复利用。在一个Dense block中,每一个卷积层的输入都是前几个卷积层输出的concatenation(拼接),这样即每一次都结合了前面所得到的特征,来得到后续的特征。因此,相比其他结构成百上千的filter,DenseNet的宽度(12,24,40)可谓是非常窄了。而每一层对前几层特征的利用并不需要额外的参数,因此在参数量上也是得到了极大的减少 。但是,其显存占用率高的缺点也比较明显(因为concatenation,不过好在后续有了解决方法:efficien-densenet)。

    与传统的层与层直接连接,L层一共有L个连接不同,DenseNet的连接在L层下,一共有L(L+1)/2的连接,其方式如下图:

tensorflow下实现DenseNet对数据集cifar-10的图像分类_第1张图片

其中growth rate(k)表示每一层的输出channels。其卷积过程用公式表示如下:

其中[x0,x1,...xl-1]表示在0层,...l-1层产生的feature-maps的concatenation(拼接)Hl(.)为一个有序的组合操作(BN-RELU-conv(3x3))。其详细图示如下:

tensorflow下实现DenseNet对数据集cifar-10的图像分类_第2张图片

文章中所述的结构除了ImageNet数据集,在cifar-SVHN等数据上使用的结构都是conv(3x3,16filters)-3xdense blocks-global avgpool-fully connection。在每一个block之间过度的降维操作使用的是:1x1conv-2x2avgpool。除此之外,文章中还给出了DenseNet-B和C,其中B版加入了Bottleneck layers,即dense blocks中的每一个3x3conv变成了1x1conv-3x3conv,在深层网络下有效减少了参数;C版加入了一个压缩因子θ,即在每一层transition layer的输出feature-maps的数量m变成θm个。其结构具体如下:

tensorflow下实现DenseNet对数据集cifar-10的图像分类_第3张图片

本文实现原版densenet,代码实现起来也非常简单,几十行即可实现,下图为结构的总体部分,其相应函数功能见附件。

tensorflow下实现DenseNet对数据集cifar-10的图像分类_第4张图片

其结果如下,论文中训练了300个epoch,我这里只训练了20个epoch,batch size 为64,可见效果不错。

tensorflow下实现DenseNet对数据集cifar-10的图像分类_第5张图片

代码下载地址:denseNet-cifar10

 

如果你觉得有用,帮忙扫个红包支持一下吧:

你可能感兴趣的:(python,计算机视觉,深度学习)