ResNet,DenseNet神经网络的差异和性能分析

参考文献:

网络框架的演变:https://www.cnblogs.com/skyfsm/p/8451834.html

densenet 性能分析:https://blog.csdn.net/u013214262/article/details/82846564

http://www.yyliu.cn/post/7cabb4ff.html

 

 

RESNET

 

随着网络深度增加,网络的准确度应该同步增加,当然要注意过拟合问题。但是网络深度增加的一个问题在于这些增加的层是参数更新的信号,因为梯度是从后向前传播的,增加网络深度后,比较靠前的层梯度会很小。这意味着这些层基本上学习停滞了,这就是梯度消失问题。深度网络的第二个问题在于训练,当网络更深时意味着参数空间更大,优化问题变得更难,因此简单地去增加网络深度反而出现更高的训练误差,深层网络虽然收敛了,但网络却开始退化了,即增加网络层数却导致更大的误差,比如下图,一个56层的网络的性能却不如20层的性能好,这不是因为过拟合(训练集训练误差依然很高),这就是烦人的退化问题。残差网络ResNet设计一种残差模块让我们可以训练更深的网络。

详细分析一下残差单元来理解ResNet的精髓

从下图可以看出,数据经过了两条路线,一条是常规路线,另一条则是捷径(shortcut),直接实现单位映射的直接连接的路线,这有点类似与电路中的“短路”。通过实验,这种带有shortcut的结构确实可以很好地应对退化问题。我们把网络中的一个模块的输入和输出关系看作是y=H(x),那么直接通过梯度方法求H(x)就会遇到上面提到的退化问题,如果使用了这种带shortcut的结构,那么可变参数部分的优化目标就不再是H(x),若用F(x)来代表需要优化的部分的话,则H(x)=F(x)+x,也就是F(x)=H(x)-x。因为在单位映射的假设中y=x就相当于观测值,所以F(x)就对应着残差,因而叫残差网络。为啥要这样做,因为作者认为学习残差F(X)比直接学习H(X)简单!设想下,现在根据我们只需要去学习输入和输出的差值就可以了,绝对量变为相对量(H(x)-x 就是输出相对于输入变化了多少),优化起来简单很多。

考虑到x的维度与F(X)维度可能不匹配情况,需进行维度匹配。这里论文中采用两种方法解决这一问题(其实是三种,但通过实验发现第三种方法会使performance急剧下降,故不采用):

  • zero_padding:对恒等层进行0填充的方式将维度补充完整。这种方法不会增加额外的参数
  • projection:在恒等层采用1x1的卷积核来增加维度。这种方法会增加额外的参数

 

下图展示了两种形态的残差模块,左图是常规残差模块,有两个3×3卷积核卷积核组成,但是随着网络进一步加深,这种残差结构在实践中并不是十分有效。针对这问题,右图的“瓶颈残差模块”(bottleneck residual block)可以有更好的效果,它依次由1×1、3×3、1×1这三个卷积层堆积而成,这里的1×1的卷积能够起降维或升维的作用,从而令3×3的卷积可以在相对较低维度的输入上进行,以达到提高计算效率的目的

###################################################################

这两种结构分别针对ResNet34(左图)和ResNet50/101/152(右图),一般称整个结构为一个”building block“。其中右图又称为”bottleneck design”,目的一目了然,就是为了降低参数的数目,第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。
对于常规ResNet,可以用于34层或者更少的网络中,对于Bottleneck Design的ResNet通常用于更深的如101这样的网络中,目的是减少计算和参数量(实用目的)。

1x1卷积层

  • 1x1卷积层 更常见的用途是: 对不同层的 feature map 进行 skip connection往往会遭遇 channel 数不匹配的情况,所以会经常用到 1x1 conv layer 进行 channle 维度的调整
  • 降维

 

 

 

为什么 VGGResNet 浅很多,两者的参数量却相当?
讨论结果: 两个原因,一是因为 ResNet省略了全连接层二是因为 ResNet采用了 bottle-neck(building block) 结构

 

DENSENET

 

DenseNet有以下几个引人注目的优点:缓解梯度消失问题,加强特征传播,鼓励特征复用,极大的减少了参数量

  •  

DenseNet 是一种具有密集连接的卷积神经网络。在该网络中,任何两层之间都有直接的连接,也就是说,网络每一层的输入都是前面所有层输出的并集,而该层所学习的特征图也会被直接传给其后面所有层作为输入。下图是 DenseNet 的一个dense block示意图,一个block里面的结构如下,与ResNet中的BottleNeck基本一致:BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3) ,而一个DenseNet则由多个这种block组成。每个DenseBlock的之间层称为transition layers,由BN−>Conv(1×1)−>averagePooling(2×2)组成

 

密集连接这个词给人的第一感觉就是极大的增加了网络的参数量和计算量。但实际上 DenseNet 比其他网络效率更高,其关键就在于网络每层计算量的减少以及特征的重复利用。DenseNet则是让l层的输入直接影响到之后的所有层,它的输出为:xl=Hl([X0,X1,…,xl−1]),其中[x0,x1,...,xl−1]就是将之前的feature map以通道的维度进行合并。并且由于每一层都包含之前所有层的输出信息,因此其只需要很少的特征图就够了,这也是为什么DneseNet的参数量较其他模型大大减少的原因。这种dense connection相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象,这样更深网络不是问题,但会有恐怖的内存占用。

需要明确一点,dense connectivity 仅仅是在一个dense block里的,不同dense block 之间是没有dense connectivity的,比如下图所示。

在DenseNet中,通过将每一层的输出直接连接到后面的所有层,来减轻梯度消失并加强了特征的传导和利用。因为特征可以重复利用,所以网络的每一层设计得很窄,这使得DenseNet的参数量很小。

直觉上,DenseNet每层的输出都会叠加到下一层的输入,这样输入的channel数肯定会暴增,参数量应该会大才对。但(估计也是为了避免这种情况)DenseNet每层卷积的输出信道数设计的非常小,最后导致k=12的40层DenseNet参数量只有1M。更进一步的DenseNet-BC对参数量进一步压缩,k=12,100层的DenseNet-BC参数量只要0.8M。而经典卷积网络VGG-11(16常用,但11是参数量最小的一个),把最后三层全连接换成全局池化,这样只有10层不到,参数量仍旧要9M

 

DneseNet在训练时十分消耗内存,这是由于算法实现不优带来的。当前的深度学习框架对 DenseNet 的密集连接没有很好的支持,所以只能借助于反复的拼接(Concatenation)操作,将之前层的输出与当前层的输出拼接在一起,然后传给下一层。对于大多数框架(如Torch和TensorFlow),每次拼接操作都会开辟新的内存来保存拼接后的特征。这样就导致一个 L 层的网络,要消耗相当于 L(L+1)/2 层网络的内存(第 l 层的输出在内存里被存了 (L-l+1) 份)。为此作者又写了一个技术报告(Memory-Efficient Implementation of DenseNets)专门针对这一问题,介绍如何提升对内存的使用率,

 

 

 

几种经典模型的尺寸,计算量和参数数量对比

 

 

 

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Densenet、Googlenet和Resnet都是常用的深度学习模型,被广泛应用于图像分类任务中。下面是对它们的性能进行分析: 1. Densenet(密集连接网络):Densenet是一种基于密集连接的网络结构,通过将每一层的输出与后续层的输入连接在一起,实现了信息的高度共享和传递。这种连接方式减轻了梯度消失问题,使得模型更易训练。Densenet数量相对较少,模型轻巧,具有较好的空间利用率。在处理小样本数据集上表现良好。 2. Googlenet:Googlenet是由Google开发的神经网络模型,具有22层深度。通过使用多个不同大小的卷积核进行并行计算,并通过注意力机制引入了Inception模块,Googlenet在减少数量的同时,仍能保持较高的准确率。此外,Googlenet通过辅助分类器和启发式池化策略,进一步提高了模型的性能。Googlenet适用于处理尺寸较大的图像数据集。 3. Resnet(残差网络):Resnet是一种基于残差学习的神经网络模型。通过引入残差块,使得网络可以学习到相对于输入的残差变化,从而解决了深层网络中的梯度消失问题。Resnet的模型深度可以达到数百层,但数量仅略高于较浅的模型。此外,Resnet中的快捷连接可以提高网络的收敛性,使得训练更加稳定。Resnet适用于处理非常深的网络和更复杂的图像任务。 总的来说,Densenet在小样本和资源受限的情况下具有较好的性能表现,Googlenet在处理较大图像数据集时表现良好,而Resnet则在处理深层网络和复杂任务时展现出优势。具体使用时,应根据具体的任务需求和资源限制选择适合的模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半九拾

援助一个bug吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值