DenseNet:Densely Connected Convolutional Networks

Motivation

最近的工作表明,如果卷积网络在靠近输入的层和靠近输出的层之间包含较短的连接,则可以进行更深入,更准确和有效的训练。

Advantages

  1. 减轻了消失梯度的问题(create short paths from early layers to later layers);
  2. 增强了特征传播;
  3. 鼓励特征重用;
  4. 大大减少了参数数量(因为不需要重新学习冗余的特征图)。

Architecture

网络的整体结构图如下所示:

传统的卷积前馈网络将第 l l l层的输出作为输入连接到第 l + 1 l+1 l+1层,这引起以下层转换: x l = H l ( x l − 1 ) x_l = H_l(x_{l-1}) xl​=Hl​(xl−1​)。 ResNets添加了一个跳过连接,该跳过连接使用标识函数绕过了非线性变换 x l = H l ( x l − 1 ) + x l − 1 x_l = H_l(x_{l-1}) + x_{l-1} xl​=Hl​(xl−1​)+xl−1​,但是标识函数和 H l H_l Hl​的输出通过求和相结合,这可能会阻碍网络中的信息流。
DenseNet的第 l l l层接收之前所有层的特征图: x 0 , . . . , x l − 1 x_0,...,x_{l-1} x0​,...,xl−1​作为输入: x l = H l ( [ x 0 , x 1 , . . . , x l − 1 ] ) x_l = H_l([x_0,x_1,...,x_{l-1}]) xl​=Hl​([x0​,x1​,...,xl−1​]), [ x 0 , x 1 , . . . , x l − 1 ] [x_0,x_1,...,x_{l-1}] [x0​,x1​,...,xl−1​]表示由 0 , . . . , l − 1 0,...,l-1 0,...,l−1层产生的特征图的拼接,三者的连接示意图如下:

复合函数(Composite function)

H l ( ⋅ ) H_l(\cdot) Hl​(⋅)表示三个连续的操作:
batch normalization (BN)、rectified linear unit (ReLU) 、and a 3 x 3 convolution (Conv)

池化层(Pooling layers)

本文的池化层指的是两个blocks之间的transition layers,这个层进行了卷积和池化操作:BN、1x1卷积、2x2平均池化层。(如下图中所示的Pooling层)

增长率(Growth rate)

如果每个函数 H ( l ) H(l) H(l)产生 k k k个特征图,则得出“第 l l l层”具有 k 0 + k × ( l − 1 ) k_0+k\times(l-1) k0​+k×(l−1)个输入特征图,其中 k 0 k_0 k0​是输入层中的通道数。DenseNet与现有网络架构之间的重要区别是DenseNet可以具有非常狭窄的层,例如k =12。我们将超参数k称为网络的增长率。
每层将自己的k个特征图添加到此状态。 增长率调节每一层对全局状态的贡献量。(我理解k为每个卷积层的卷积核的个数,即输出的特征图的数目)

瓶颈层(Composite function)

DenseNet-B:BN-ReLU-Conv(1 × \times × 1)-BN-ReLU-Conv(3 × \times × 3)
1 × \times × 1的卷积产生了4k个特征图。

压缩(Compression)

在transition层减少特征图的数目以便于进一步的提升模型的紧凑性。
如果一个dense block包含 m m m个特征图,则让下一个transition layer生成( θ m \theta_m θm​ 下取整)个输出特征图,其中 0 < θ ≤ 1 0 <\theta \leq1 0<θ≤1称为压缩因子。
当 θ = 1 \theta = 1 θ=1时,通过transition layers的特征图数量保持不变。 我们将 θ < 1 \theta < 1 θ<1 的DenseNet称为DenseNet-C,并在实验中将其设置为 θ = 0.5 \theta = 0.5 θ=0.5。
当同时使用瓶颈和transition层( θ < 1 \theta < 1 θ<1)时,我们将模型称为DenseNet-BC

Implement Details

在除ImageNet之外的所有数据集上:

  • DenseNet
  • dense blocks:3个,每个dense blocks具有相同数量的层。
  • 在进入第一个dense block之前,对输入图像执行16个卷积(或DenseNet-BC增长率的两倍)的卷积。
  • 卷积层:kernel size(3x3)、zero-padded(保持特征图大小固定)
  • 中间过渡层:1x1卷积 + 2x2平均池化
  • 最后一个密集块的末尾:全局平均池化 + softmax分类器
  • 三个密集块中的特征图大小分别为:32x32、16x16和8x8
  • 基本DenseNet配置:{L= 40,k = 12},{L= 100,k = 12},{L= 100,k = 24}
  • DenseNetBC配置:{L= 100,k = 12},{L= 250,k = 24},{L= 190,k = 40}

ImageNet上的实验:

  • DenseNet-BC结构
  • input_size:224x224
  • dense blocks:4个
  • 初始卷积层:size(7x7),stride(2),个数2k个卷积
  • 其他层的特征图数量也取自设置k。 表1显示了我们在ImageNet上使用的确切网络配置。

下表是在ImageNet上使用的确切网络配置

Code(Keras)

定义DenseLayer

def DenseLayer(x, nb_filter, bn_size=4, alpha=0.0, drop_rate=0.2):# Bottleneck layersx = BatchNormalization(axis=3)(x)x = LeakyReLU(alpha=alpha)(x)x = Conv2D(bn_size*nb_filter, (1, 1), strides=(1,1), padding='same')(x)# Composite functionx = BatchNormalization(axis=3)(x)x = LeakyReLU(alpha=alpha)(x)x = Conv2D(nb_filter, (3, 3), strides=(1,1), padding='same')(x)if drop_rate: x = Dropout(drop_rate)(x)return x

用DenseLayer构建DenseBlock

def DenseBlock(x, nb_layers, growth_rate, drop_rate=0.2):for ii in range(nb_layers):conv = DenseLayer(x, nb_filter=growth_rate, drop_rate=drop_rate)x = concatenate([x, conv], axis=3)return x

如论文中所述,将每一个Dense层的输出与其输入融合之后作为下一Dense层的输入,来实现密集连接。
DenseBlock之间的过渡层

def TransitionLayer(x, compression=0.5, alpha=0.0, is_max=0):nb_filter = int(x.shape.as_list()[-1]*compression)x = BatchNormalization(axis=3)(x)x = LeakyReLU(alpha=alpha)(x)x = Conv2D(nb_filter, (1, 1), strides=(1,1), padding='same')(x)if is_max != 0: x = MaxPooling2D(pool_size=(2, 2), strides=2)(x)else: x = AveragePooling2D(pool_size=(2, 2), strides=2)(x)return x

论文中提出使用均值池化层来作下采样,不过在边缘特征提取方面,最大池化层效果应该更好,这里就加了相关接口。
将上述结构按照论文中提出的结构进行拼接,这里选择的参数是论文中提到的L=100,k=12,网络连接如下:

growth_rate = 12inpt = Input(shape=(32,32,3))x = Conv2D(growth_rate*2, (3, 3), strides=1, padding='same')(inpt)
x = BatchNormalization(axis=3)(x)
x = LeakyReLU(alpha=0.1)(x)x = DenseBlock(x, 12, growth_rate, drop_rate=0.2)x = TransitionLayer(x)x = DenseBlock(x, 12, growth_rate, drop_rate=0.2)x = TransitionLayer(x)x = DenseBlock(x, 12, growth_rate, drop_rate=0.2)x = BatchNormalization(axis=3)(x)
x = GlobalAveragePooling2D()(x)x = Dense(10, activation='softmax')(x)model = Model(inpt, x)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])model.summary()

参考:Keras实现DenseNet结构

DenseNet:Densely Connected Convolutional Networks相关推荐

  1. 论文精读:DenseNet:Densely Connected Convolutional Networks

    1.核心思想 最近的研究表明,如果在卷积网络的输入与输出之间添加短连接(shorter connections),那么可以使得网络变得更深.更准,并且可以更有效的训练.本文,我们围绕短连接思想,提出密 ...

  2. 骨干网络之DenseNet:Densely Connected Convolutional Networks论文学习

    0.优点 核心就两个模块:dense block ,transition.我看完这篇论文觉得和resnet的思想很想 1.由于他和renet一样都是会在训练的时候提前底层特征所以会避免梯度消失 (re ...

  3. 论文笔记:Densely Connected Convolutional Networks (2017 CVPR)

    [引用格式]:G. Huang, Z. Liu, L. Van Der Maaten and K. Q. Weinberger, "Densely Connected Convolution ...

  4. 论文笔记:Densely Connected Convolutional Networks(DenseNet模型详解)

    [ 转载自http://www.yyliu.cn/post/7cabb4ff.html ] CVPR 2017上,清华大学的Zhuang Liu.康奈尔大学的Gao Huang和Kilian Q.We ...

  5. 论文阅读:DENSELY CONNECTED CONVOLUTIONAL NETWORKS

    概述 作者观察到目前的深度网络有一个重要的特点是shorted connected,认为能够训练极深的网络很可能就是由于这个原因. 于是作者提出了Densely connected convoluti ...

  6. CVPR2017:密集连接的卷积网络DenseNet《Densely Connected Convolutional Networks》

    文章目录 原文地址 初识 相知 回顾 参考 原文地址 https://arxiv.org/abs/1608.06993 初识 深度卷积神经网络由于相关信息和梯度在前向传递和反向传播时都需要经过很多层, ...

  7. 【DenseNet】Densely Connected Convolutional Networks (2018) 全文翻译

    作者 Gao Huang∗(Cornell University,gh349@cornell.edu) Zhuang Liu∗(Tsinghua University,liuzhuang13@mail ...

  8. 【图像分类】(DenseNet)Densely Connected Convolutional Networks

    论文名称:Densely Connected Convolutional Networks 论文下载地址:https://arxiv.org/pdf/1608.06993.pdf 论文代码地址:htt ...

  9. Densely Connected Convolutional Networks(论文解读三)

    目录 DenseNet:论文解读 1. Abstract 2. Related work 2.1 通过级联来加深网络 2.2 通过 shortcut 连接来加深网络 2.3 通过加宽网络来使网络更深 ...

最新文章

  1. Java计算两个字符串日期之间的天数差
  2. Windows Server 2008与2012建立林信任关系
  3. 机器学习--信息 信息熵 信息增益
  4. Java黑皮书课后题第2章:2.10(科学:计算能量)编写程序,计算将水从初始温度加热到最终温度所需的能量。程序应该提示用户输入水的重量(kg),以及水的初始温度、最终温度
  5. jaba窗体连接mysql增删改查_知识实现——Java使用jdbc连接MySql数据库,实现增删改查...
  6. Python之简单验证码实现
  7. vue 实例数据绑定 指令 事件
  8. RocketMQ一行代码造成消息发送失败
  9. 11倍增长!支付宝自研数据库OceanBase再次刷新世界纪录
  10. 反编译代码遇到的问题
  11. .h和.cpp文件的区别 .
  12. 漫剪AE插件丨一键分屏VE Super Grid插件
  13. java编程规范换行_Java源代码的换行规则
  14. EPS FB信令流程
  15. android 免root 模拟器,真正免root的root工具箱详细使用教程
  16. 西南交大大学生营养早餐优化食谱
  17. pyscripter支持python什么版本_PyScripter在Windows上具有多个Python版本
  18. fw_setenv的配置及使用
  19. 网页制作存在的一些难点
  20. SSM源码分析之23种设计模式(策略模式和模板模式)

热门文章

  1. 合肥工业大学计算机学院导师名单,合肥工业大学计算机与信息学院硕士研究生导师介绍:唐益明...
  2. 采购HDI盲埋孔电路板的注意事项?
  3. 爬虫学习(二)--爬取360应用市场app信息
  4. ai钢笔工具怎么描线_如何用钢笔工具自如绘制直线和曲线?(一)
  5. 【IDEA 教程系列第 31 篇】idea 快速跳回上一个操作和跳到下一个动作
  6. 年轻人秃了,这家公司却赚翻了
  7. 简略地月星系三维展现
  8. Machine Learning - 逻辑回归(Logistic Regression)
  9. Python数据分析与挖掘——线性回归预测模型
  10. 视频图像数据处理一:分离yuv420视频图像的y、u、v分量