resnet结构_谈一谈ResNet和DenseNet

a448e23b6111c73fe82214d50ac4ef11.png

如果您喜欢我的文章,欢迎关注我的专栏。

ResNet和DenseNet是计算机视觉领域的经典工作,作为CVPR 2016和2017的best paper,两者不仅有很强的创新性,而且大道至简,给了我们很好的启发。本文的目的是解读一下ResNet和DenseNet中那些影响深远的创新,让我们对网络架构有更深刻的思考。

ResNet(Deep Residual Learning for Image Recognition)

8149459390ece3172011cdfbe645a4e1.png

Paper link:

Deep Residual Learning for Image Recognition​arxiv.org

Code link:

facebook/fb.resnet.torch​github.com
7b310dedba55d53e4ee52a8ea4c75286.png

1/加深网络的利与弊

神经网络中,通过层数的堆积,我们能够获得更加丰富的特征表达,网络层数越多,意味着能够提取到不同的layer特征越丰富,并且,越深的网络提取的特征越抽象,越具有语义信息。在众多计算机视觉任务中,要想获得更好的性能表现,语义信息和分辨率信息缺一不可,只倚靠浅层的分辨率信息,不足以取得很好的效果。如下图所示,我们熟知的AlexNet,VGG,GoogLeNet都通过各种方法增加网络的层数,事实也证明网络层数的增加带来了性能的显著提升。

d2a53727cf146c25fd92efde2acc80fe.png

但是神经网络的层数是否是堆得越深越好呢,答案是否定的。深度学习的神经网络层数并非越深越好,主要有两个原因:

(1)一味的增加网络深度会带来梯度消失和梯度爆炸问题,因为来自误差函数的梯度信号会在反向传播时,传播到更早的层时会出现指数级别的变化,或上升或下降,导致收敛困难甚至不能收敛,难以学习。

(2)网络会出现退化,也就是说单纯的堆积网络正确率不升反降,那是不是因为过拟合问题呢?不是!因为过拟合是在训练集上表现很好而在测试集上表现很差,但是如下图所示,作者利用56layer和20layer做实验,结果表明,56layer在训练集和测试集上的表现均不如20layer,这就说明不是过拟合问题,而是网络模型出现了性能退化。

181bfec77e7f61f95103f63829c0aac9.png

这个事实说明,单纯的堆layer并不能提升网络的表现,直观上推测,更深度的网络不会比更浅度的同类型网络差,试想一下,构建了一个n层的网络,并且达到了一定的精度,那么一个n+1层的网络至少也能实现同样的准确度,只要简单的复制前面的n层 ,并且在第n+1层增加一层关于n层的恒等映射就可以了,然而上图的实验结果表明,n+1层的网络结构,往往比n层的准确度要差。我们需要改进加深网络层数的方法,于是ResNet应运而生,为什么说ResNet能解决这个问题呢,论文作者将ResNet归结为一个单一的假设,直接映射是难以学习的,而ReseNet学习的是残差,这是更容易学习的。

2/ResNet设计

下图是ResNet的核心结构,残差网络以块(block)为单位,每个block由一系列的层和一个捷径(shortcut),shortcut将模块的输入和输出连接在一起,然后在元素层面上进行加(add),相当于跨过中间层,进行简单的同等映射,这样做不会产生额外的参数,不会增加计算的复杂度,而且保证至少加深后网络的性能不会比加深前差。此外为了保证输入和输出的维度相同,能够进行加,可以利用1x1卷积进行升维或者降维来匹配。

d9a0dac1219cb51d44eac6486b821a32.png
ResNet中的块结构

以上图为例,设该块的输出为H(x),那么H(x)=F(x)+x,如果从头开始学习这个等式是复杂苦难的,于是,作者构造一个残差,现在的重心变为对F(x)=0进行优化,这种优化方向是更容易学习的,试想一下,如果恒等映射是最优的,我们可以将中间的几个非线性层的权重趋于0来逼近即可。

898e8e92ff2791a246547431a9bf550a.png

接下来,说一下shortcut的内容,以x,y为输入输出,F()表示需要学习的残差映射,一个块结构可以用如下公式表示:

d55a6b7706c7d56519e32498c8c1193c.png

以两层残差为例,F函数可以表示为:

7bb190b6f2c01d8ec04ee9b75da22252.png

其中σ是ReLu激活函数

从上面几个公式可以看出,shortcut结构既没有引入额外的参数,也没有增加模型的复杂度,可谓一举多得,这里还有一个问题,就是x和F的维度问题,我们可以简单的加上一个线性变化或者利用1x1卷积进行升降维:

53d14a2dcb97512c57124dde964f1028.png

知道了一个block的结构后,我们升高镜头,看一下整个ResNet的结构,为了更加直观化,将VGG-19,34层的普通网络以及34层的ResNet放在一起对比,结构如下图所示:

035469f541890f063268f499753805eb.png

ResNet有不同层数的版本,下表列出了几个经典ResNet结构的详细信息:

1bfdd089af792f24185ef3edb02f04f6.png

作者做了大量详实的实验,验证普通网络/ResNet,不同层数的ResNet之间的性能,结果都表明,通过ResNet进行层数加深,能够解决梯度消失,爆炸和网络退化问题,取得更好的性能表现,这里仅列几张图

ba4acf3165a8754180bfad28f1018e0b.png

04480d5dd56b37ce7c04addef9784fb4.png

a2febd40b91f65af15db7d404515c4a4.png

3/ResNet的启发

行家一出手,就只有没有,这篇论文作者栏里的名字都是如雷贯耳,而ResNet也没有辜负我们的期待,设计的非常巧妙,我想增加网络层数,好,满足你;我担心梯度问题和退化,好,我给你解决;我不想增加模型复杂度,好,不仅不增加复杂度,还没有额外参数的引入...... ResNet将shortcut的方法融合进来,与其从头学一个恒等映射,不如学一个残差来的更快更好,在日后,ResNet也成为了一众目标检测网络的backbone,影响深远


DenseNet(Densely Connected Convolutional Networks)

e544c5aeec442cbd3418266fc45dba96.png

Paper link:

Densely Connected Convolutional Networks​arxiv.org

Code link:

liuzhuang13/DenseNet​github.com
c8aea87214ce62b741074339e70ac4ba.png

1/DenseNet的核心思想

2016年的ResNet通过独具创造的设计,证明了加深网络层数和提升模型准确性是可以兼顾的,作为2017CVPR的 best paper,DenseNet对于ResNet是有借鉴的,但是更重要的是,DenseNet在借鉴的基础上,推陈出新,工作同样非常有创意且出色。

基于CNN的网络结构变得更加深度,从AlexNet,VGG,GoogLeNet再到ResNet,我们从来没有放弃过对深度的追求,因为,加深网络确实会带来更丰富的表达,但是正如我在ResNet中说到的,越来越深的网络是不利于梯度在层之间的传播的,很容易发生梯度消失或者爆炸问题,为了解决这个问题,各个网络结构大显神通,ResNet,Highway Net将信息从一层转发到下一层;随机深度网络通过在训练过程中随机drop掉一些层,缩短了ResNet,促进了信息和梯度信息更好的流动;FractalNets构造的是一种分形网络,将多个具有不同卷积块数的并行层序列组合在一起,获得较大的名义深度,同时保持网络中的许多短路径。尽管这些网络各有高招,但是都有一个关键特征:都具有从early layer到later layer的短路结构(short path)

顾名思义,DenseNet采用的是一种更密集的连接方式,是一个密集卷积神经网络,以前向传播方式,将每一层与其余层密集连接。这样做的目的是可以确保各层之间的信息流动达到最大,将所有层(特征图大小匹配)直接连接在一起,注意,这里是维度上相加。

传统的卷积神经网络,L层一共会有L个连接,是一种一对一的模式;在DenseNet中,一个层会和其余所有层相连,因此,同样L层,会有L(L+1)/2个连接。DenseNet的结构如下图所示,对于每一层而言,前面所有层的特征映射都用作输入,而它自己的特征映射也会用作后面所有层的输入。

b44277cb7472006cf0dfae45ff8c7886.png
DenseNet结构

DenseNet有以下几个显著特点:

(1)缓解了梯度消失问题

(2)增强了特征在网络间的传播

(3)实现和加强了特征重用

(4)有效减少了参数数量

2/DenseNet的设计

在ResNet中,层与层之间是元素相加的,但是在DenseNet中,不同层之间的连接方式变成了concatenating,即维度上的叠加。

这种密集连接的模式,乍一看非常繁琐,会引入很多参数,其实完全相反,DenseNet比传统的卷积网络所需要的参数更少,因此密集连接带来了特征重用,不需要重新学习冗余的特征图,而且维度拼接的操作,带来了丰富的特征信息,利用更少的卷积就能获得很多的特征图。

传统的前向传播网络结构可以看做是状态在不同层的传递,每一层读取状态信息,并将其写入下一层,在这个过程中,状态将会发生变化但同时那些需要被保存的信息会继续传递下去,在ResNet中,通过添加shortcuts,显式的保存此信息。而在DenseNet中,明确区分了添加到网络中的信息和保留的信息,DenseNet层非常狭窄,只向网络的集合知识(collective knowledge)中添加一小组特征映射,并保持其余的特征映射不变,最终分类器根据网络中的所有特征映射做出决策。

除了更高效的参数,DenseNet还有一个大的优势就是它提升了整个网络中信息和梯度的流动,对训练十分有利。密集连接的结构,使得每一层都可以直接从损失函数和原始输入信号获得梯度,对于训练更深的网络十分有利,同时作者还提出,密集连接的网络结构有正则化的效果,能够减少过拟合风险。

为了便于公式表达,先预定义一些符号:输入图片为X0,神经网络层数为L,l为层数索引,Hl(.)表示非线性操作组合,包括BN,ReLu,3x3卷积,第l层的输出为Xl

  • 在ResNet中,因为加入shortcuts映射,第l层的输出可以用下列公式表示:

e155434da68211cd122e4ad5a2414c44.png

ResNets的一个优点是梯度可以直接通过恒等函数从latter layer流向early layer。但恒等映射和非线性变换输出的叠加方式是相加, 这在一定程度上破坏了网络中的信息流。

  • 在DenseNet中,是当前层和后面所有层密集连接,此时第l层的输出可以用下列公式表示:

3272369f6d9af3b38b7600cac82ed1d6.png

其中,[X0, X1, . . . , Xl-1]表示从0-(l-1)层feature map张量拼接,也就是在channel上直接进行叠加。

  • Pooling layers(池化层设计)

张量拼接(concatenation)操作必须保证feature map的大小是一致的,否则无法完成维度叠加的操作,但是池化操作又是必不可少的,为了调和这个矛盾,便于在架构中进行下采样,如下图所示,作者将网络划分为多个紧密连接的密集块(dense blocks),在同一个block保持feature map大小相同,然后在块之间引入过渡层(transition layers),这个层的构成很简单:BN层+1x1卷积层+2x2平均池化层,通过过渡层,实现下采样。

26461896c7ebed5d412c918ef7d970ab.png
  • Growth rate

假定经过一个Hl(.)后会产生k个feature map,那么对于第l层网络来说,一共会有 (k0 +k ×(l-1)个feature map作为输入,其中k0是当前层的feature map数量。如下表所示,DenseNet与其他的网络结构很大的不同在于可以接受较少的特征图作为网络层的输出

2edbad4e20a8dcc5920bc0117f6035d0.png
  • Compression

这里首先引入一个compression概念,为了进一步优化模型的简洁性,我们同样可以在transition layer中降低feature map的数量。若一个Denseblock中包含m个feature maps,那么可以通过transition layer层生成⌊θm⌋个feature map。其中θ为Compression factor, 当θ=1时,transition layer将保留原feature维度不变。

  • Bottleneck layers

虽然DenseNet接受较少的feature map作为输出,但由于不同层feature map之间由通道叠加的操作,最终的feature map的channel仍然会比较大而成为网络的负担。作者在这里使用1×1 Conv(Bottleneck)作为特征降维的方法来降低channel数量。经过改善后的非线性变换变为BN+ReLU+Conv(1×1)+BN+ReLU+Conv(3×3)

3/分析和实验

在这里,将使用compression且θ=0.5的DenseNet命名为DenseNet-C, 将使用Bottleneck和compression且θ=0.5的DenseNet命名为DenseNet-BC。作者将不同的网络结构在CIFAR和SVHN上进行实验,如下表所示,K表示经过Hl(.)后的输出特征图数量。每个数据集上的最佳结果用蓝色标出,可以看到,相比ResNet等网络,DenseNet在参数更少的情况下,取得了最好的性能表现。

949bf9c247a538264ead9f3320fb60a7.png

4/ Q&A

关于DenseNet的问题,有几个问题值得探讨,列在下面,内容来自参考文章第一篇

1.DenseNet 是否可以在物体检测任务中使用?效果如何?

A:当然,DenseNet 可以通过和 ResNet 一样的方法被应用到物体检测任务中。但是作者并没有在物体检测任务上进行实验,如果关注 DenseNet 在物体检测任务上的效果,可以参考第三方的将 DenseNet 用在物体检测任务上的实验结果。

2.通过图表可以看到,DenseNet 在相对较小计算量和相对较小的模型大小的情况下,相比同等规模的 ResNet 的准确率提升会更明显。是否说明 DenseNet 结构更加适合小模型的设计?

A:确实,在小模型的场景下 DenseNet 有更大的优势。同时,作者也和近期发表的 MobileNet 这一针对移动端和小模型设计的工作进行了对比,结果显示 DenseNet(~400MFlops)可以在更小的计算量的情况下取得比 MobileNet(~500MFlops)更高的 ImageNet 分类准确率。

3.DenseNet 中非常关键的连续的跨层 Concatenate 操作仅存在于每个 Dense Block 之内,不同 Dense Block 之间则没有这种操作,是怎样一种考虑?

A:事实上,每个 Dense Block 最后的特征图已经将当前 Block 内所有的卷积模块的输出拼接在一起,整体经过降采样之后送入了下一个 Dense Block,其中已经包含了这个 Dense Block 的全部信息,这样做也是一种权衡。

4.DenseNet 这样的模型结构在训练过程中是否有一些技巧?

作者针对优化问题,专门写了一篇文章,详情可点击下文

https://arxiv.org/pdf/1707.06990.pdf​arxiv.org

ResNet和DenseNet的比较

5f606bdd4ca0cec22222482355c98b61.png

参考文章

https://blog.csdn.net/zchang81/article/details/76155291​blog.csdn.net https://blog.csdn.net/sigai_csdn/article/details/82115254​blog.csdn.net
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值