DensetNet 介绍

毕业设计题目是《生成对抗网络医学图像数据增强的分析与实现》,在网上找了好长时间,选取了吴恩达教授在网上公开的数据集 CheXpert,该数据集是一个大型胸片数据集,之前的论文已经有所介绍,现在我们就跟着这篇论文,介绍一下他们所使用的分类模型, DenseNet,同时我们也使用该模型作为衡量医学图像数据增强前后的实验效果。

Densely Connected Convolutional Networks 于 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR) 斩获最佳论文奖,是 CV 界大名鼎鼎的 DenseNet,我们从以下这几个方面来进行介绍。

DenseNet 综述

在计算机视觉领域,卷积神经网络 CNN 早已称为了最为主流的方法,从LeNet, AlexNet,GoogLeNet,卷积神经网络一步步登上了历史舞台,当然这也是源于 CNN 架构在判别器模型中的良好效果。2016 年,何凯明大神 提出 Deep Residual Learning for Image Recognition(ResNet) 网络架构,使得 卷积神经网络在 CV 乃至整个 AI 领域几乎占据了主导地位,成为了深度学习方向最主要的网络结构之一。 ResNet 可以训练出更深的 CNN 模型,进一步实现更高的准确度,它的核心在于层与层之间的短路连接 (skip connection), skip connection 有助于训练过程中的梯度的反向传播,一定程度上减缓因为梯度消失导致网络训练不动,甚至效果下降的情况。

何凯明大神在提出 ResNet 时假设,倘若某一层较深网络 \(\rm N_1\) 多出 另一个较浅的网络 \(\rm N_2\) 若干层 \(\Delta N\),倘若 \(\Delta N\) 有能力做到恒等映射,那么这一较深的网络 \(N_1\) 训练得到的模型性能一定不弱于浅层网络。借用于沐神在动手深度学习中的一张图,可以深刻的理解这一情况,何凯明所构造的 ResNet 残差网络便是构造出了嵌套函数类。

然而,和 ResNet、Inception 网络不同的是,DenseNet 并没有主要从网络的深度和宽度入手,DenseNet 的作者从 feature 入手,通过对 feature 的细腻操控,达到了更好的效果和更少的参数。DenseNet 的中心思想是与其多次学习冗余的特征,特征复用,是一种更好的特征提取方式!

DenseNet 特色

Densetnet 和 ResNet对比

ResNet: 通过建立前面层和后面层的短路连接(skip connection), 帮助实现训练过程中更有效的反向传播,训练出更深的 CNN 网络;
DenseNet: 采用密集连接机制,互相连接所有的层,每个层会将前面所有层的输出,在 channel 维度上进行 concat 操作,作为当前层的输入,进而实现特征重用。使用过该种方法不仅仅缓解了梯度消失的现象,也使得其在参数和计算量更少的情况下实现比 ResNet 更优的性能;


图 resnet 中的 skip connection(+ 表示的元素相加)


图 densenet 中的密集连接机制 (C 表示的是 channel 进行 concat 操作)

下面,我们从公式的角度来查看 DenseNet 和 ResNet:
传统的网络在 \(l\) 层输出为 \(x_l = H_l(x_{l-1})\)
对于 ResNet,增加了来自于上一层的输入 \(x_l = H_l(x_{l-1}) + x_{l-1}\)
但是在 DenseNet 中,将前面所有层的输出 concat 作为当前层的输入 \(x_l = H_l([x_{0}, x_{1}, ..., x_{l-1}])\) [] 表示 concat 操作。 其中 \(H_l(\cdot )\) 代表非线性转换函数,他是一个组合操作,可能包括一系列的 BN(Batch Normalization), ReLU, Pooling 和 Conv

网络结构

从上文的简单介绍中,可以了解到 DenseNet 的关键操作是通过 concat 连接特征图,而 concat 操作带来的限制是 特征图的大小必须相同 (ResNet中的 + 也会),因此 DenseNet 中的网络大致分为两大块, DenseBlock 和 Transition,其中 DenseBlock 内部包含很多层,层与层之间进行 Dense 稠密 concat 连接,特征图大小相同; transition 部分是连接相邻的 DenseBlock,并通过 Pooling 操作降低特征图的大小,还可以控制通道数降低模型的复杂度。


图 由 dense block 和 transition layer 组成的 DenseNet

DenseBlock 块

1、在 DenseBlock块中,包含有很多层,每个层含有特征图的大小相同,这又是为了我们在通道channel 上进行 concat 操作。DenseBlock中每一层,采用的非线性组合函数\(H_l(\cdot )\)往往是 BN + ReLU + 3X3 Conv 结构。

2、假定 DenseBlock 初始输出的特征图 channel数量等于 \(k_0\), DenseBlock 中各个层卷积输出特征图的维度均为 \(k\),那么不难计算,我们在第 \(l\) 层输出的 channel 数量为 \(k_0+k(l-1)\),我们将k称之为网络的增长率(growth rate)

3、因为在 DenseBlock 中的每一层都需要接受前面所有层的 feature map,当层次越来越深时,通过输入通道计算公式\(k_0+k(l-1)\)不难得知,in_channel 数量数量越大,为了降低模型计算量和模型复杂度,我们常常使用较小的 增长率 K,通常为12, 同时K也具有特殊含义k 实际也是这层新提取出的特征数量

4、Dense Block 采取的是激活函数在前,卷积在后的顺序,即为 BN - ReLU - Conv2d,该种方式也称为 pre-activation。 然而我们通常我模型使用顺序往往是 post-activation,即为 Conv2d - BN - ReLU。论文作者使用了两种方法进行实验,发现 pre-activation 效果会更好。 这里,可以发现无论 pre-activation 和 post-activation 都为 BN-ReLU 而不是 ReLU-BN,因为先进行 ReLU 已经会对数据的分布造成影响,使得数据 \(\ge 0\)

考虑到 DenseBlock 后面层中输入 Channel 可能会变得很大,可以通过 1X1 卷积来降低输入通道数,进行降低计算量和模型复杂度,即为
BN + ReLU + 1X1 Conv + BN + ReLU + 3X3 Conv
该层成为 bottleneck 层,该种结构DenseNet也被称为 DenseNet-B 结构。其中 1X1 Conv 得到4k个特征图,它所起到的作用是降低特征数量,提高计算速率。

对于每一个 Bottleneck 输出的特征通道数是相同的。这里的 1X1 Conv 是用于固定输出通道数,达到较为的作用。1X1卷积的输出通道数往往为四倍的 growth rate。当DenseBlock 中 几十个 BottleNeck (Layer) 相连接时, concat 后的通道数会增加到上千,若不进行降维,模型参数量过多、计算量太大 ,几乎难以训练。

我们通过一下实例,计算 BottleNeck 前后,卷积参数数量的变化,我们假设输入通道数为 64, 增长率 k=32, 经过15 个BottleNeck,当前通道数输出为 64 + 32 * 15 = 544,
卷积 conv 的参数量为 in_channel X out_channels X kernel_size X kernel_size
conv 的计算量为 in_channel X out_channels X kernel_size X kernel_size X width X Height
如果不使用 1X1 conv
==> 参数量 = 544 x 32 x 3 x 3 = 156672
==> 计算量 = 544 x 32 x 3 x 3 x width x height = 156672 * width * height
如果使用 1X1 conv
==> 参数量 = 544 x (32 x 4) x 1 x 1 + (32 x 4) x 32 x 3 x 3 = 106496
==> 计算量 = 544 x (32 x 4) x 1 x 1 x width x height + (32 x 4) x 32 x 3 x 3 x width x height = 106496 * width * height

从中可以看出参数量的降低,归根结底是使用小的kernel_size(1X1),来预先减低通道数,进而改变我们的模型参数量和计算复杂度

Transition 层

transition 层,主要作用是连接两个相邻的 DenseBlock,并降低特征图的大小。Transition层包括一个 1X1的卷积和 2X2的 AvgPooling,结构为 BN - ReLU - 1X1 Conv - 2x2 AvgPooling

Transition 可以压缩模型大小。我们假定 Transition 上接 DenseBlock 得到的特征图 Channels 数量为m,Transition 层,可以产生\(\lfloor \theta m \rfloor\) 个特征(通过 1X1 conv),其中 \(\theta \in (0, 1]\),为压缩系数,通常 \(\theta=0.5\),当压缩系数小于1时,我们称该种 DenseNet 为 DenseNet-C 架构。 倘若既使用 BottleNet,也使用了 小于 1的压缩系数,该 Transition 组合结构称为 DenseNet-BC

实验结果

下面,展示一下不同架构的 DenseNet 和其他网络架构在 CIFAR 和 SVHN 数据集上的效果

以及在 ImageNet 上的效果

DenseNet 小结

DenseNet作为另一种拥有较深层数的卷积神经网络,具有如下优点:

(1) 对模型参数数量和计算量的控制
DenseNet 中采取了挺多较为实用的技巧,来控制模型的复杂度和计算量,总体来说说对 1X1 conv的使用较低通道数,更为具体的则是体现在 BottleNeck 和 Transition 的压缩系数,并对我们的 growth rate 进行控制

(2) 对特征的重用技巧
DenseNet 中最为精巧的便是特征重用的思想,他并没有加深网络深度和宽度(然后受复杂度影响,没有tricks也很难加深),而且采用了特征重用。该 facebook 团队认为与其多次学习冗余的特征,特征复用,是一种更好的特征提取方式!所以他每次复用之前的特征,并产生新的 k 的特征。

(3) 网络更易于训练,并具有一定的正则效果.
缓解了gradient vanishing和model degradation的问题。缓解的原因在于 DenseBlock 中 in_channel 源于直连,减低了反向传播过程中梯度所流经的网络,传播的更过,所导致的 gradient vanish, exploded 的可能性更小。

个人思考

1、DenseNet 和 ResNet
DenseNet 和 ResNet 非常的相似,从运算的角度上来看,仅仅是 ResNet 为特征图按位置进行相加(要求特征图维度、大小相同),而DenseNet为特征图进行concat(要求特征图大小相同),不过他同样是要求了进行 Dense 连接,而且GrowthRate=k,也就是DenseNet 用的是之前的特征,每次一点点产生新的特征。
那么我们可以取两者中间, ResNet 中的 按元素 + 更改为 concat 操作,如果特征图的 维度过大,我们是可以通过 1X1 conv 降低通道数,进而降低模型复杂度、计算量。

2、BottleNeck 结果为什么是 4k
BottleNeck 1x1conv后得到的通道数是4k,这个 4k 首先应该和暴搜相关,不过联想到我们后面需要提取 k 个特征图,4k的数量也足够 3X3 conv 进行特征提取的了。

参考链接

CSDN: DenseNet介绍
知乎: DenseNet详解
Bilibili: densenet
A Review of Popular Deep Learning Architectures: DenseNet, ResNeXt, MnasNet, and ShuffleNet v2

posted @ 2022-05-05 18:18  lucky_light  阅读(765)  评论(0编辑  收藏  举报