首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Densenet密集连接的卷积网络

目录

1 简单介绍

1.1 背景介绍

1.2 本文概要

1.2.1 模型结构预览

1.2.2 优点

1.2.3 实验结果

2 模型结构

2.1 整体结构

2.2 Feature Block

2.3 Dense Block 和 Dense Layer

2.3.1 Dense Layer

2.3.2 Dense Block

2.4 Transition Block

2.5 循环Dense Block和Transition

2.6 ClassificationBlock

2.7 整合以上过程

3 实验与结果

3.1 训练参数

3.2 结果

1 简单介绍

论文题目:Densely Connected Convolutional Networks

发表机构:康奈尔大学,清华大学,Facebook AI

发表时间:2018年1月

论文代码:https://github.com/WangXiaoCao/attention-is-all-you-need-pytorch

pytorch代码:https://github.com/WangXiaoCao/attention-is-all-you-need-pytorch

1.1 背景介绍

1.卷积神经网络CNN在计算机视觉物体识别上优势显著,典型的模型有:LeNet5, VGG, Highway Network, Residual Network.

2.CNN越深则效果越好,但是,会面临梯度弥散的问题,经过层数越多,则前面的信息就会渐渐减弱和消散。

3.目前已有很多措施去解决以上困境:

(1)Highway Network,Residual Network通过前后两层的残差链接使信息尽量不丢失

(2)Stochastic depth通过随机drop掉Resnet的一些层来缩短模型

(3)FractalNets通过重复组合一些平行的层序列来保证深度的同时减轻这个问题。

但这些措施都有一个共性:都是在前一层和后一层中都建立一个短连接。比如,酱紫:

1.2 本文概要

1.2.1 模型结构预览

本文提出的densenet就更霸道了,为了确保网络中最大的信息流通,让每层都与改层之前的所有层都相连,即每层的输入,是前面所有层的输出的concat.(resnet用的是sum).整体结构是酱紫的:

1.2.2 优点

1.需要更少参数。

2.使得信息(前向计算时)或梯度(后向计算时)在整个网络中的保持地更好,可以训练更深的模型。

3.dense connection有正则化的效果,在较少训练集上减少过拟合。

1.2.3 实验结果

在4个benchmark datasets (CIFAR-10, CIFAR-100, SVHN, and

ImageNet)上测试。

大部分任务上都优于state of art.

2 模型结构

2.1 整体结构

1.输入:图片

2.经过feature block(图中的第一个convolution层,后面可以加一个pooling层,这里没有画出来)

3.经过第一个dense block, 该Block中有n个dense layer,灰色圆圈表示,每个dense layer都是dense connection,即每一层的输入都是前面所有层的输出的拼接

4.经过第一个transition block,由convolution和poolling组成

5.经过第二个dense block

6.经过第二个transition block

7.经过第三个dense block

8.经过classification block,由pooling,linear层组成,输出softmax的score

9.经过prediction层,softmax分类

10.输出:分类概率

作者在4个数据集上进行测试,CIFAR-10, CIFAR-100, SVHN上构建的是以上3个dense block + 2个transition block;在ImageNet上构建的是4个dense block + 3个transition block。两者在参数的设置上略有不同,下文将以ImageNet上构建的densenet为例进行讲解。

2.2 Feature Block

Feature Block是输入层与第一个Dense Block之间的那一部分,上面结构图中只画了一个卷积,在ImageNet数据集上构建的densenet中其实后面还跟了一个poolling层。计算过程如下:

输入:图片 (244*244*3)

1.卷积层convolution计算:in_channel=3, out_channel=64,kernel_size=7,stride=2,padding=3,输出(122*122*64)

2.batch normalization计算,输入与输出维度不变 (122*122*64)

3.激活函数relu计算,输入与输出维度不变 (122*122*64)

4.池化层poollig计算,kenel_size=3, stride=2,padding=1,输出(56*56*64)

2.3 Dense Block 和 Dense Layer

2.3.1 Dense Layer

一个Dense Block中是由L层dense laryer组成,layer之间是dense connectivity。从下面这个公式上来体会什么是dense connectivity,第l层的输出是:

H_l是该layer的计算函数,输入是x0到x_l-1的拼接,即模型的原始输出(x0)和前面每层的输出的拼接。这个拼接是channel维度上的拼接,即维度(56*56*64)的数据 和(56*56*32)的数据拼接成(56*56*96)的数据维度。

而ResNet就不同了,是直接将前一层的输出加在该层的输出之上:

Dense Layer中函数H(·)的计算过程如下(括号中的数据维度是以第一个dense block的第一个dense layer为例的,整个模型的k值是预先设定的,本模型为k=32):

输入:Feature Block的输出(56*56*64)或者是上一层dense layer的输出

1.Batch Normalization, 输出(56*56*64)

2.ReLU ,输出(56*56*64)

3.Bottleneck,是可选的,为了减少 feature-maps的数量,过程如下3步

-1x1 Convolution, kernel_size=1, channel = 4k, 则输出为(56*56*128)

-Batch Normalization(56*56*128)

-ReLU(56*56*128)

4.Convolution, kernel_size=3, channel = k (56*56*32)

5.Dropout,可选的,用于防止过拟合(56*56*32)

Bottleneck代码如下:

2.3.2 Dense Block

Dense Block有L层dense layer组成

layer 0:输入(56*56*64)->输出(56*56*32)

layer 1:输入(56*56*(32*1))->输出(56*56*32)

layer 2:输入(56*56*(32*2))->输出(56*56*32)

...

layer L:输入(56*56*(32*L))->输出(56*56*32)

注意,L层dense layer的输出都是不变的,而每层的输入channel数是增加的,因为如上所述,每层的输入是前面所有层的拼接。

2.4 Transition Block

Transition Block是在两个Dense Block之间的,由一个卷积+一个pooling组成(下面的数据维度以第一个transition block为例):

输入:Dense Block的输出(56*56*32)

1.Batch Normalization 输出(56*56*32)

2.ReLU 输出(56*56*32)

3.1x1 Convolution,kernel_size=1,此处可以根据预先设定的压缩系数(0-1之间)来压缩原来的channel数,以减小参数,输出(56*56*(32*compression))

4.2x2 Average Pooling 输出(28*28*(32*compression))

2.5 循环Dense Block和Transition

论文中,在ImageNet的数据集上,构建的densenet是由4个Dense Block,和3个Transition构成,按照上文讲述的过程,数据流的演变过程应该是:

2.6 ClassificationBlock

最后一步是ClassificationBlock,这一步将原来3维的数据拉平成一维,再接上全连接层,以准备做softmax。计算过程如下:

输入:Transition3的输出(7*7*32)

1.Batch Normalization, 输出(7*7*32)

2.ReLU, 输出(7*7*32)

3.poolling, kernel_size=7, stride=1,输出(1*1*32)

4.flatten,将(1*1*32)铺平成(1*32)

5.Linear全连接,输出(1*classes_num) classes_num为待分类的数目

flatendiamante如下:

最后将以上输出进入softmax,预测每个类别的概率。

2.7 整合以上过程

将以上所有过程都这个起来,构建一个完整的densenet模型,代码如下:

我们可以根据构建好的densenet模型,输入不同参数,得到自定义的densenet模型,论文中,作者分别尝试了如下深度的模型:

区别在于dense_blocks_num_layers的设置,也就是每个dense block中的dense layer的数目。

3 实验与结果

3.1 训练参数

3.2 结果

在CIFAR和SVHN数据集上的结果:

在Imagenet上的结果:

文章代码来自:https://github.com/WangXiaoCao/attention-is-all-you-need-pytorch

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181111G18O7S00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券