论文: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、传统卷积架构:
一个传统的卷积层可以这样表示:,F是卷积操作、Y是输出张量、X是输入张量。
那么一个卷积模型可以表示为:,实际上,ConvNet层通常被划分为多个阶段,每个阶段中的所有层共享相同的架构:,使用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、、成正比,因此我们限制,以便对于任何新的φ,总FLOPS将大致增加,以确保在缩放过程中,计算复杂度(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,这意味着假设有双倍的资源可用。然后,他们通过一个小规模的网格搜索来确定最佳的缩放系数α、β和γ。这些系数分别对应于网络深度、宽度和分辨率的缩放比例。
- 通过这个搜索,作者找到了EfficientNet-B0的最佳缩放系数:α=1.2(深度),β=1.1(宽度),γ=1.15(分辨率),这些系数满足约束条件α·β^2·γ^2≈2,这个约束条件确保了在扩展模型时,计算复杂度(FLOPS)的增加是可控的。
-
步骤2:使用不同的φ值进行扩展
- 在确定了α、β、γ的最优值之后,作者将这些值固定,并使用不同的φ值来扩展基线网络,从而得到EfficientNet-B1到B7系列模型。
- φ值是一个复合系数,它决定了模型扩展的程度。通过改变φ的值,可以在不同的资源约束下获得不同规模的模型。例如,当φ=1时,模型的深度、宽度和分辨率分别按照α、β、γ的比例扩展,从而得到EfficientNet-B1。随着φ值的增加,模型会进一步扩展,从而得到更大的EfficientNet模型。
三、模型效果
1、模型性能、参数量、计算复杂度比较:
2、模型迁移能力:
3、缩放策略比较:
类激活图效果: