【计算机视觉】经典的图卷积网络框架(LeNet、AlexNet、VGGNet、InceptionNet 、ResNet、DenseNet)
文章目录
1. 介绍
在transformer横行的时代,一些经典的图卷积网络框架貌似失去了原有的光辉。但是,
- 在一些领域,比如分割、目标追踪领域,一些经典的模型还在发光发热,一部分原因是transformer参数量大,且训练消耗大。
因此,本文将讲解与回顾CV领域经典的图卷积网络框架:
- LeNet:论文地址
- AlexNet:论文地址
- VGGNet:论文地址
- InceptionNet(GoogleNet)
- [v1] Going Deeper withConvolutions, 6.67% test error,2014.9
论文地址 - [v2] Batch Normalization:Accelerating Deep Network Training by Reducing Internal Covariate Shift, 4.8% test error,2015.2
论文地址 - [v3] Rethinking theInception Architecture for Computer Vision, 3.5%test error,2015.12
论文地址 - [v4] Inception-v4,Inception-ResNet and the Impact of Residual Connections on Learning, 3.08% test error,2016.2
论文地址
- [v1] Going Deeper withConvolutions, 6.67% test error,2014.9
- ResNet:论文地址
- DenseNet:论文地址
2. 经典的图卷积网络框架
2.1 LeNet
2.1.1 由来
LeCun认为,使用机器学习的技术解决模式识别问题变得越发重要。他写这篇论文的一个重要目的就是证明模式识别的系统可以依赖自动学习的技术,而不是手工设计的启发式方法。
- 以字符识别为例,LeCun证明人工设计特征抽取的工作可以通过特别设计的机器学习方法替代,并直接应用在原始的像素图像上。这里字符识别任务是指从识别图像上的字符。当然,LeCun这里想要证明的就是使用神经网络可以较好地做字符识别任务。
在使用机器学习自动识别字符之前,研究者通常使用人工设计特征抽取的方式,将图像的特征抽取出来,然后使用分类器进行分类,得到字符识别的结果。
- 人工设计的特征抽取方法通常叫做视觉描述器(Visual Descriptor - Wikipedia)参考:机器视觉特征介绍:HOG、SIFT、SURF、ORB、LBP、HAAR,如局部二值模式(Local Binary Patterns),就是用某个像素周围的8个像素值与之比较,大的是0,小的是1,得到的特征。如下图所示:
上述提取特征需要人为去设定,何不来利用机器去自主学习特征?接下来就是重点内容,我们介绍一下LeNet-5的结构。LeNet-5是用来处理手写字符的识别问题的。总共有7层。其结果如下:
2.1.2 LeNet-5 结构
-
输入:32x32的灰度图像,也就是一个通道,那么一个图像就是一个2维的矩阵,没有RGB三个通道。
-
Layer1:6个大小为5x5的卷积核,步长为1。因此,到这里的输出变成了28x28x6。
-
Layer2:2x2大小的池化层,使用的是average pooling,步长为2。那么这一层的输出就是14x14x6。
-
Layer3:16个大小为5x5的卷积核,步长为1。但是,这一层16个卷积核中只有10个和前面的6层相连接。也就是说,这16个卷积核并不是扫描前一层所有的6个通道。
- 如下图,0 1 2 3 4 5这 6个卷积核是扫描3个相邻,然后是6 7 8这3个卷积核是扫描4个相邻,9 10 11 12 13 14这6个是扫描4个非相邻,最后一个15扫描6个。实际上前面的6通道每个都只有10个卷积核扫描到。
这么做的原因是打破图像的对称性,并减少连接的数量。如果不这样做的话,每一个卷积核扫描一层之后是10x10,一个核大小是5x5,输入6个通道,输出16个,所以是10x10x5x5x6x16 =240000个连接。但实际上只有156000连接。训练参数的数量从2400变成了1516个。
- 如下图,0 1 2 3 4 5这 6个卷积核是扫描3个相邻,然后是6 7 8这3个卷积核是扫描4个相邻,9 10 11 12 13 14这6个是扫描4个非相邻,最后一个15扫描6个。实际上前面的6通道每个都只有10个卷积核扫描到。
-
Layer4:和第二层一样,2x2大小的池化层,使用的是average pooling,步长为2。
-
Layer5:全连接卷积层,120个卷积核,大小为1x1。
这里的第五层转换理解起来有点困难,第四层结束输出为16x5x5,相当于这里16x5x5展开为400个特征,然后使用120神经元去做全连接,如下图所示:
-
Layer6:全连接层,隐藏单元是84个。
-
Layer7:输出层,输出单元是10个,因为数字识别是0-9。
最终,LeNet-5的总结如下:
2.1.3 特点
LeNet有一些操作,在现在看来并不是很常见。
- 第一个就是第三层的卷几层并没有利用上一层所有的通道。这个一般很少这么做。这个一方面是减少了训练参数,一方面也是希望能检测到不同的模式。
- 另一个是输出层之前加了一个全连接层,也就是强制要把所有的图像变成一个84维的向量,然后去分类。
- 还有一点就是使用average pooling。这个一般现在主要是用maxpooling,因为maxpooling的效果更好。
2.2 AlexNet
2.2.1 由来
AlexNet是2012年 ImageNet 竞赛冠军获得者 Hinton 和他的学生 Alex Krizhevsky 设计的。AlexNet 中包含了几个比较新的技术点,也是首次在CNN中成功应用了ReLU、Dropout 和 LRN 等Trick。同时AlexNet 也使用了GPU进行运算加速。
AlexNet 将LeNet的思想发扬光大,把CNN的基本原理应用到了很深很宽的网络中。AlexNet主要使用到的新技术点如下:
- 首次利用GPU进行网络加速训练。
- 使用了ReLU激活函数,而不是传统的Sigmoid激活函数以及Tanh激活函数。(smoid求导比较麻烦而且当网路比较深的时候会出现梯度消失)
- 标准的L-P神经元的输出一般使用tanh或 sigmoid作为激活函数,但是这些饱和的非线性函数在计算梯度的时候都要比非饱和的线行函数慢很多,在这里称为 Rectified Linear Units(ReLUs)。在深度学习中使用ReLUs要比等价的tanh快很多。
- 使用了LRN局部响应归一化。
- 在全连接层的前两层中使用了Dropout随机失活神经元操作,以减少过拟合。
- dropout: 使用dropout后,在每一层中随机失活一些神经元——减少训练参数从而减少over fitting。
2.2.2 AlexNet 结构
Alexnet 网络是由五个卷积层和三个全连接层构成,其中最后的输出被送到1000维的softmax函数。
- 在卷积层的第一、第二和第五层使用了最大池化函数,
- 并且在卷积层的第一和第二层使用了标准化 LRN函数。
- Local Response Normalization(局部响应归一化):在神经网络中,我们用激活函数将神经元的输出做一个非线性映射,但是tanh和sigmoid这些传统的激活函数的值域都是有范围的,但是ReLU激活函数得到的值域没有一个区间,所以要对ReLU得到的结果进行归一化,也就是Local Response Normalization。参考 深度学习的归一化方法的演变(局部响应LRN,BN,LN, IN, GN, FRN, WN, BRN, CBN, CmBN)
- 在全连接层的前两层使用了Dropout函数,来解决神经网络的过拟合问题。
- Relu激活函数应用在每个卷积层和全连接层。
AlexNet网络的计算的过程如下:
输入 → 输出的大小计算过程为:(W - K + 2P) / S + 1,
- W: 输入图片尺寸 width
- K:卷积核大小 kernel_size
- P: 填充的边距 padding
- S: 步长 stride
2.2.3 特点
- 使用了两个GPU 。由于数据量较大,将网络分配给两个GPU,GPU之间交换数据只会在某些层上发生,不会在所有层上发生第三层从第二层获取数据时会跨GPU,而第四层从第三层获取数据时,只会在同一GPU上进行;
- 在数据预处理阶段,将图片随机截取227*227大小,以及他们的水平翻转形成 的图片作为总的样本。在- 测试时,截取5个227×227的图像块以及它们的水平映射作为样本;
- 使用了Relu非线性激活函数,训练时间更快;
- 在Relu后使用了LRN作为归一化的方法,局部响应归一化;
- 使用了最大池化函数,并且重叠池化,池化核为3*3,步长为2,训练效果更好,传统的池化核在平移过程中,区域不会重合;
- 在全连接层的前两层使用Dropout,用来解决过拟合问题,减少隐藏层之间的相互作用。
- 以概率p将某些神经元的值变为0,这些神经元不会参加正向和反向传播;
- 但是对于不同的输入,构建的不同的网络模型使用相同的权重;
- 测试时使用全部的神经元,但是神经元的值会减半。
2.3 VGGNet
VGGNet 是由⽜津⼤学计算机视觉组参加图像分类竞赛时提出的,VGG即Visual Geometry Group,VGGNet相对于AlexNet来说,其在深度上翻了⼀番,最深可达19层,所以叫做Very Deep。
- VGG可以应用在人脸识别、图像分类等方面,分别从VGG16~VGG19。
VGG研究卷积网络深度的初衷是想搞清楚卷积 “网络深度” 是如何影响大规模图像分类与识别的精度和准确率的,最初是VGG-16号称非常深的卷积网络全称为(GG-Very-Deep-16 CNN),VGG在加深网络层数同时为了避免参数过多,在所有层都采用3x3的小卷积核,卷积层步长被设置为1。
VGG的输入被设置为224x244大小的RGB图像,在训练集图像上对所有图像计算RGB均值,然后把图像作为输入传入VGG卷积网络,使用3x3或者1x1的filter,卷积步长被固定1。
VGG全连接层有3层,根据卷积层+全连接层总数目的不同可以从VGG11 ~ VGG19,最少的VGG11有8个卷积层与3个全连接层,最多的VGG19有16个卷积层+3个全连接层.
此外VGG网络并不是在每个卷积层后面跟上一个池化层,还是总数5个池化层,分布在不同的卷积层之下,下图是VGG11 ~GVV19的结构图:
2.3.1 VGG16
conv1^2 64) -> pool1 -> conv2^2 (128) -> pool2 -> conv3^3 (256) -> pool3 ->
conv4^3 (512) ->pool4 -> conv5^3 (512) -> pool5 -> fc6 (4096) -> fc7 (4096)
-> fc8 (1000) -> softmax。 ^3代表重复3次。
上图中的网络共2(卷积层)+2(卷积层)+3(卷积层)+3(卷积层)+3(卷积层)+1(全连接层)+1(全连接层)+1(全连接层)=16层,因此是一个VGG16网络。
2.3.2 AlexNet、VGG16、VGG19三者结构对比
与AlexNet相比,VGG网络的评估结果更好,损失更低,精确度更高,但是VGG网络运行时间更久,由于网络更深,参数更多,耗费了更多的资源,占据了更多的内存。
2.3.3 特点
- 结构简单,作者将卷积核全部替换为3×3(极少用了1×1);相比于AlexNet 的池化核,VGG全部使用2×2的池化核。
- 参数量大,而且大部分的参数集中在全连接层中。网络名称中有16表示它有16层conv/fc层。
- 合适的网络初始化和使用批量归一(batch normalization)层对训练深层网络很重要。
- VGG-19结构类似于VGG-16,有略好于VGG-16的性能,但VGG-19需要消耗更大的资源,因此实际中VGG-16使用得更多。
- 由于VGG-16网络结构十分简单,并且很适合迁移学习,因此至今VGG-16仍在广泛使用。
2.3.4 说明
VGGNet结构所有卷积层的kernel都只有3 x 3。VGGNet中连续使用3组3 x 3kernel(stride为1)的原因是它和使用1个7 x 7kernel产生的效果相同(下图以一维卷积为例解释效果相同的原理),然而更深的网络结构会学习到更复杂的非线性关系使得模型效果更好。该操作带来的另一个好处是参数数量的减少,因为对于一个有C个kernel的卷积层来说,原来的参数个数为7 x 7 x C,而新的参数个数为3 x(3 x 3 x C)。
除此之外,3个串联的3x3卷积层的参数数量要比一个7x7卷积层的参数数量小得多,即333C2/77C2 = 55%,更少的参数意味着减少过拟合,而且更重要的是3个3x3卷积层拥有比1个7x7的卷积层更少的非线性变换(前者拥有3次而后者只有一次),使得CNN对特征的学习能力更强。
2.4 InceptionNet(GooLeNet)
2.4.1 简介
GoogLeNet是2014年Christian Szegedy提出的一种全新的深度学习结构,在这之前的AlexNet、VGG等结构都是通过增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量来提升网络性能。但这种方式存在以下问题:
- 参数太多,如果训练数据集有限,很容易产生过拟合;
- 网络越大、参数越多,计算复杂度越大,难以应用;
- 网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。
解决这些问题的方法当然就是在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到,
- 将全连接变成稀疏连接。
但是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。
那么,有没有一种方法既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,就如人类的大脑是可以看做是神经元的重复堆积,因此,GoogLeNet团队提出了Inception网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。
2.4.2 GooLeNet 结构
Inception模块的基本机构如下图,整个Inception结构就是由多个这样的Inception模块串联起来的。
- Inceptionv1
- Inceptionv2
最主要的就是1x1的卷积核,如何发挥作用?
- 1x1卷积的主要目的是为了减少维度,还用于修正线性激活(ReLU)。
举个例子:
-
比如,上一层的输出为100x100x128,经过具有256个通道的5x5卷积层之后(stride=1,padding=2),输出数据为100x100x256。其中,卷积层的参数为128x5x5x256= 819200。
而假如上一层输出先经过具有32个通道的1x1卷积层,再经过具有256个输出的5x5卷积层,那么输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256= 204800,大约减少了4倍。
基于Inception构建了GoogLeNet的网络结构如下(共22层):
另一种表示:
2.4.2.1 对结构的说明
- GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;
- 网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network)。
- 事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整;
- 虽然移除了全连接,但是网络中依然使用了Dropout ;
- 为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。
- 辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。
2.4.2.2 网络结构图细节
注:上表中的 #3x3 reduce,#5x5 reduce 表示 在3x3,5x5卷积操作之前使用了1x1卷积的数量。
GoogLeNet网络结构明细表解析如下:
-
输入:原始输入图像为224x224x3,且都进行了零均值化的预处理操作(图像每个像素减去均值)。
-
第一层(卷积层):使用7x7的卷积核(滑动步长2,padding为3),64通道,输出为112x112x64,卷积后进行ReLU操作,经过3x3的max pooling(步长为2),输出为((112 - 3+1)/2)+1=56,即56x56x64,再进行ReLU操作。
-
第二层(卷积层)使用3x3的卷积核(滑动步长为1,padding为1),192通道,输出为56x56x192,卷积后进行ReLU操作,经过3x3的max pooling(步长为2),输出为((56 - 3+1)/2)+1=28,即28x28x192,再进行ReLU操作
-
第三层(Inception 3a层),分为四个分支,采用不同尺度的卷积核来进行处理
- 64个1x1的卷积核,然后RuLU,输出28x28x64
- 96个1x1的卷积核,作为3x3卷积核之前的降维,变成28x28x96,然后进行ReLU计算,再进行128个 - 3x3的卷积(padding为1),输出28x28x128
- 16个1x1的卷积核,作为5x5卷积核之前的降维,变成28x28x16,进行ReLU计算后,再进行32个5x5的卷积(padding为2),输出28x28x32
- pool层,使用3x3的核(padding为1),输出28x28x192,然后进行32个1x1的卷积,输出28x28x32。
- 将四个结果进行连接,对这四部分输出结果的第三维并联,即64+128+32+32=256,最终输出28x28x256
-
第三层(Inception 3b层)
- 128个1x1的卷积核,然后RuLU,输出28x28x128
- 128个1x1的卷积核,作为3x3卷积核之前的降维,变成28x28x128,进行ReLU,再进行192个3x3的卷积(padding为1),输出28x28x192
- 32个1x1的卷积核,作为5x5卷积核之前的降维,变成28x28x32,进行ReLU计算后,再进行96个5x5的卷积(padding为2),输出28x28x96
- pool层,使用3x3的核(padding为1),输出28x28x256,然后进行64个1x1的卷积,输出28x28x64。
- 将四个结果进行连接,对这四部分输出结果的第三维并联,即128+192+96+64=480,最终输出输出为28x28x480
-
第四层(4a,4b,4c,4d,4e)、第五层(5a,5b)……,与3a、3b类似,在此就不再重复。
2.4.3 主要贡献与比较
-
主要贡献:
- 一是使用1x1的卷积来进行升降维;
- 二是在多个尺寸上同时进行卷积再聚合。
-
比较:
- VGG继承了LeNet以及AlexNet的一些框架结构,而GoogLeNet则做了更加大胆的网络结构尝试。
- 虽然深度只有22层,但大小却比AlexNet和VGG小很多,
- GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,
- VGGNet参数又是AlexNet的3倍,
因此在内存或计算资源有限时,GoogleNet是比较好的选择;从模型结果来看,GoogLeNet的性能却更加优越。
2.5 ResNet
2.5.1 ResNet 介绍
ResNet是一种残差网络,是由来自Microsoft Research的4位学者提出的卷积神经网络,在2015年的ImageNet大规模视觉识别竞赛(ImageNet Large Scale Visual Recognition Challenge, ILSVRC)中获得了图像分类和物体识别的优胜。 残差网络的特点是:
- 容易优化,并且能够通过增加相当的深度来提高准确率。
- 其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。
1) 网络的深度为什么重要?
- 增加网络的宽度和深度可以很好的提高网络的性能,深的网络一般都比浅的的网络效果好,比如说一个深的网络A和一个浅的网络B,那A的性能至少都能跟B一样,为什么呢?
- 因为就算我们把B的网络参数全部迁移到A的前面几层,而A后面的层只是做一个等价的映射,就达到了B网络的一样的效果。
- 一个比较好的例子就是VGG,该网络就是在AlexNet的基础上通过增加网络深度大幅度提高了网络性能。
CNN能够提取 low/mid/high-level 的特征,网络的层数越多,意味着能够提取到不同level的特征越丰富。并且,越深的网络提取的特征越抽象,越具有语义信息。
2) 为什么不能简单地增加网络层数?
-
对于原来的网络,如果简单地增加深度,会导致梯度弥散或梯度爆炸。
- 对于该问题的解决方法是正则化初始化和中间的正则化层(Batch Normalization),这样的话可以训练几十层的网络。
-
虽然通过上述方法能够训练了,但是又会出现另一个问题,就是退化问题,网络层数增加,但是在训练集上的准确率却饱和甚至下降了。注意,这个不能解释为overfit,因为overfit应该表现为在训练集上表现更好才对。
- 退化问题说明了深度网络不能很简单地被很好地优化。
作者通过实验:通过浅层网络 + y=x 等同映射构造深层模型,结果深层模型并没有比浅层网络有等同或更低的错误率,推断出,
- 退化问题可能是因为深层的网络并不是那么好训练,也就是求解器很难去利用多层网络拟合同等函数。
3) 深度网络的退化问题
- 网络的深度对模型的性能至关重要,当增加网络层数后,网络可以进行更加复杂的特征模式的提取,所以当模型更深时理论上可以取得更好的结果。
实验发现深度网络出现了退化问题(Degradation problem):网络深度增加时,网络准确度出现饱和,甚至出现下降。这个现象可以在图中直观看出来:56层的网络比20层网络效果还要差。
- 这不是过拟合问题,因为56层网络的训练误差同样高。我们知道深层网络存在着梯度消失或者爆炸的问题,这使得深度学习模型很难训练。但是现在已经存在一些技术手段如BatchNorm来缓解这个问题。因此,出现深度网络的退化问题是非常令人诧异的。
4) 怎么解决退化问题?
- 这就要利用深度残差网络。
- 如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络。那现在要解决的就是学习恒等映射函数了。
- 但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因。
- 但是,如果把网络设计为H(x) = F(x) + x,如下图。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x. 而且,拟合残差肯定更加容易。
这有点类似与电路中的“短路”,所以是一种短路连接(shortcut connection)。
残差:观测值与估计值之间的差。
这里H(x)就是观测值,x就是估计值(也就是上一层ResNet输出的特征映射)。
我们一般称x为identity Function,它是一个跳跃连接;称F(x)为ResNet Function。
假设F是求和前网络映射,H是从输入到求和后的网络映射。比如把5映射到5.1,那么引入残差前是F’(5)=5.1,引入残差后是H(5)=5.1, H(5)=F(5)+5, F(5)=0.1。这里的F’和F都表示网络参数映射,引入残差后的映射对输出的变化更敏感。比如s输出从5.1变到5.2,映射F’的输出增加了1/51=2%,而对于残差结构输出从5.1到5.2,映射F是从0.1到0.2,增加了100%。明显后者输出变化对权重的调整作用更大,所以效果更好。残差的思想都是去掉相同的主体部分,从而突出微小的变化。
2.5.2 ResNet 结构
作者由VGG19设计出了plain 网络和残差网络,如下图中部和右侧网络。然后利用这两种网络进行实验对比。
- 通过短路机制加入了残差单元,如图所示。变化主要体现在ResNet直接使用stride=2的卷积做下采样,并且用global average pool层替换了全连接层。
从上图中可以看到,
- ResNet相比普通网络每两层间增加了短路机制,这就形成了残差学习,
- 其中虚线表示feature map数量发生了改变。展示的34-layer的ResNet,还可以构建更深的网络如表所示。
从表中可以看到,对于18-layer和34-layer的ResNet,其进行的两层间的残差学习,当网络更深时,其进行的是三层间的残差学习,三层卷积核分别是1x1,3x3和1x1,一个值得注意的是隐含层的feature map数量是比较小的,并且是输出feature map数量的1/4。
2.5.3 设计的规则和方案
设计网络的规则:
- 对于输出feature map大小相同的层,有相同数量的filters,即channel数相同;
- 当feature map大小减半时(池化),filters数量翻倍,这保持了网络层的复杂度。
对于残差网络,维度匹配的shortcut连接为实线,反之为虚线。维度不匹配时,同等映射有两种可选方案:
- 直接通过zero-padding 来增加维度(channel)。
- 乘以W矩阵投影到新的空间。实现是用1x1卷积实现的,直接改变1x1卷积的filters数目。这种会增加参数。
2.6 DenseNet
2.6.1 介绍
AlexNee、VGG-19、Incepetion之后,CNN史上的一个里程碑事件是ResNet模型的出现,ResNet可以训练出更深的CNN模型,从而实现更高的准确度。ResNet模型的核心是,
- 通过建立前面层与后面层之间的“短路连接”(shortcuts,skip connection),这有助于训练过程中梯度的反向传播,从而能训练出更深的CNN网络。
而DenseNet(Densely connected convolutional networks) 模型,它的基本思路与ResNet一致,但是它建立的是前面所有层与后面层的密集连接(dense connection),它的名称也是由此而来。
DenseNet的另一大特色是,
- 通过特征在channel上的连接来实现特征重用(feature reuse)。这使得DenseNet在参数和计算成本更少的情形下实现比ResNet更优的性能,
- DenseNet也因此斩获CVPR 2017的最佳论文奖。
2.6.2 DenseNet的结构
相比ResNet,DenseNet提出了一个更激进的密集连接机制:即互相连接所有的层,具体来说就是每个层都会接受其前面所有层作为其额外的输入。
- ResNet网络的连接机制
- 作为对比,DenseNet的密集连接机制。
可以看到,ResNet是每个层与前面的某层(一般是2~3层)短路连接在一起,连接方式是通过元素级相加。而在DenseNet中,每个层都会与前面所有层在channel维度上连接(concat)在一起(这里各个层的特征图大小是相同的,后面会有说明),并作为下一层的输入。相比ResNet,这是一种密集连接。
- 而且DenseNet是直接concat来自不同层的特征图,这可以实现特征重用,提升效率,这一特点是DenseNet与ResNet最主要的区别。
2.6.3 优势
综合来看,DenseNet的优势主要体现在以下几个方面:
- 由于密集连接方式,DenseNet提升了梯度的反向传播,使得网络更容易训练。由于每层可以直达最后的误差信号,实现了隐式的“deep supervision”;
- 参数更小且计算更高效,这有点违反直觉,由于DenseNet是通过concat特征来实现短路连接,实现了特征重用,并且采用较小的growth rate,每个层所独有的特征图是比较小的;
- 由于特征复用,最后的分类器使用了低级特征。
要注意的一点是,如果实现方式不当的话,DenseNet可能耗费很多GPU显存,一种高效的实现如图所示,更多细节可以见这篇论文Memory-Efficient Implementation of DenseNets。
3. 参考
【1】https://blog.csdn.net/u013963380/article/details/93316111
【2】https://blog.csdn.net/happy488127311/article/details/124192601
【3】https://blog.csdn.net/qq_44766883/article/details/112011420