论文:https://arxiv.org/abs/1905.11946

项目:https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet

Pytorch实现:EfficientNet模型Pytorch版本具体实现-CSDN博客

一、概况

1、概述:

这张图可以清晰明了的显示EfficientNet 的卓越表现,一句话总结:更小的模型、更快的速度、更好的效果。

2、模型发展脉络:

卷积神经网络(ConvNets)通常在固定的资源预算下开发,然后在有更多资源可用的情况下进行扩展以获得更好的准确性。对于模型的扩展,通常来说有三条思路:模型的深度、模型的宽度、模型处理图像的分辨率。在以前的工作中,通常只扩展三个维度中的一个——深度、宽度和图像大小。尽管可以任意扩展两个或三个维度,但任意扩展需要繁琐的手动调整,并且通常会产生次优的准确性和效率。扩展的主要困难在于最优的三个维度相互依赖,并且在不同的资源约束下值会变化。

扩展模型的深度:模型扩展最先想到扩展深度,直觉是更深的卷积网络可以捕获更丰富和更复杂的特征,并且在新任务上泛化良好。然而,更深的网络也更难训练,因为梯度消失问题(可以通过批量归一化和残差连接缓解,但非常深的网络的准确性增益减少)。

扩展模型的宽度:扩展网络宽度通常用于小型模型,更宽的网络倾向于能够捕获更细粒度的特征,并且更容易训练。然而,极宽但浅的网络在捕获高级特征方面存在困难。

提高模型处理的图像分辨率:有了更高分辨率的输入图像,卷积网络可以潜在地捕获更细粒度的模式。

单独提高上述三个方面中的一个会出现上图的结果:可以发现不管是提高深度、宽度、还是分辨率都可以提高模型的性能,这一点已经在实际中有了ResNet就是扩展模型深度的代表,MobileNet就是扩展模型宽度的代表。

但是从上图我们可以发现单独提高 深度、宽度、还是分辨率中的一个存在边界递减效应,精度增益在达到80%后迅速饱和,这表明了单维缩放的局限性。直观上,复合扩展方法有道理,因为如果输入图像更大,那么网络需要更多的层来增加接收场,更多的通道来捕捉更大图像上的更细粒度的模式。

研究表明,平衡网络宽度/深度/分辨率的所有维度至关重要,而且令人惊讶的是,这种平衡可以通过简单地以恒定比例扩展它们来实现。本文方法以一组固定的扩展系数均匀地扩展网络宽度、深度和分辨率。

二、技术细节

1、传统卷积架构: 

一个传统的卷积层可以这样表示:Y_{i}=F_{i}(X_{i}),F是卷积操作、Y是输出张量、X是输入张量。

那么一个卷积模型可以表示为:N=F_{k}\bigodot ...F_{2}\bigodot F_{1}(X_{1}),实际上,ConvNet层通常被划分为多个阶段,每个阶段中的所有层共享相同的架构:N=\bigodot F_{i}^{L_{i}} (X),使用F来表示每个阶段的操作,Li是每个阶段该操作要重复的次数。

与传统的卷积网络设计主要关注寻找最佳的层架构Fi不同,EfficientNet模型扩展试图在不改变基线网络中预定义的Fi的情况下扩展网络长度(Li)、宽度(Ci)和分辨率(Hi; Wi)。

那么问题就变成了一个优化问题:我在任何给定的资源约束下最大限度地提高模型精度:

其中w, d,r是用于扩展网络宽度、深度和分辨率的系数,H、W、C是给定的参数。

如上图所示, 在固定深度和分辨率的情况下改变宽度:每一条线都是基准模型的性能情况,横坐标不同表示改变的宽度,在更深(d=2.0)和更高分辨率(r=2.0)的情况下,宽度扩展在相同的FLOPS成本下实现了更好的准确性。所以怎么找到一组合适的权重w, d,r呢?

2、混合缩放:

缩放系数:

α; β; γ是可以通过小网格搜索确定的常数。由于常规卷积操作的FLOPS与d、w^{2}r^{2}成正比,因此我们限制\alpha ·\beta ^{2}·\gamma ^{2}\approx 2,以便对于任何新的φ,总FLOPS将大致增加2^{\phi },以确保在缩放过程中,计算复杂度(FLOPS)的增加保持在一个合理的范围内。

在确定了α、β、γ的最佳值之后,作者使用一个复合系数φ来统一控制网络宽度、深度和分辨率的缩放。φ是一个用户指定的系数,用于控制模型扩展有多少额外资源可用,而α、β、 γ分别指定如何将这些额外资源分配给网络宽度、深度和分辨率。

3、模型结构:

后续的模型参数:

 # (width, depth, resolution, dropout)        
'efficientnet-b0': (1.0, 1.0, 224, 0.2),       
'efficientnet-b1': (1.0, 1.1, 240, 0.2),       
'efficientnet-b2': (1.1, 1.2, 260, 0.3),        
'efficientnet-b3': (1.2, 1.4, 300, 0.3),       
'efficientnet-b4': (1.4, 1.8, 380, 0.4),        
'efficientnet-b5': (1.6, 2.2, 456, 0.4),        
'efficientnet-b6': (1.8, 2.6, 528, 0.5),       
'efficientnet-b7': (2.0, 3.1, 600, 0.5)

怎么得到的?

  1. 步骤1:确定缩放系数(α、β、γ)

    • 在这一步中,作者首先设定φ=1,这意味着假设有双倍的资源可用。然后,他们通过一个小规模的网格搜索来确定最佳的缩放系数α、β和γ。这些系数分别对应于网络深度、宽度和分辨率的缩放比例。
    • 通过这个搜索,作者找到了EfficientNet-B0的最佳缩放系数:α=1.2(深度),β=1.1(宽度),γ=1.15(分辨率),这些系数满足约束条件α·β^2·γ^2≈2,这个约束条件确保了在扩展模型时,计算复杂度(FLOPS)的增加是可控的。
  2. 步骤2:使用不同的φ值进行扩展

    • 在确定了α、β、γ的最优值之后,作者将这些值固定,并使用不同的φ值来扩展基线网络,从而得到EfficientNet-B1到B7系列模型。
    • φ值是一个复合系数,它决定了模型扩展的程度。通过改变φ的值,可以在不同的资源约束下获得不同规模的模型。例如,当φ=1时,模型的深度、宽度和分辨率分别按照α、β、γ的比例扩展,从而得到EfficientNet-B1。随着φ值的增加,模型会进一步扩展,从而得到更大的EfficientNet模型。

三、模型效果

1、模型性能、参数量、计算复杂度比较:

 

2、模型迁移能力:

3、缩放策略比较: 

类激活图效果:

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐