EfficientNet 是一系列卷积神经网络架构,它旨在在计算资源受限的情况下实现更好的性能。EfficientNet 的设计思想是在网络的深度、宽度和分辨率方面进行均衡的调整,以获得高效且高性能的模型。
以下是 EfficientNet 的主要特点和设计原则:
复合系数(Compound Scaling):EfficientNet 使用了复合系数来平衡网络的深度、宽度和分辨率。它通过对网络的不同维度(例如深度、宽度、分辨率)应用统一的缩放因子来确保网络各个部分之间的平衡。这种方法使得网络可以在不同的任务和计算资源条件下进行调整。
宽度乘数(Width Multiplier):EfficientNet 使用宽度乘数来控制每个层级的通道数,从而降低了网络的计算复杂度。较小的宽度乘数将减少参数量,使模型更轻量,而较大的宽度乘数则可以增加模型的性能。
深度乘数(Depth Multiplier):深度乘数控制网络的深度。较小的深度乘数会减少层级数,使模型更浅,而较大的深度乘数则会增加网络深度,提高模型的表征能力。
分辨率乘数(Resolution Multiplier):分辨率乘数用于控制输入图像的分辨率。较小的分辨率乘数会降低输入图像的分辨率,从而减少计算复杂度,而较大的分辨率乘数则会增加输入图像的分辨率,提高模型的视觉表征能力。
EfficientNet 版本:EfficientNet 提供了不同版本(如 B0、B1、B2、B3、B4、B5、B6、B7),这些版本具有不同的复杂度和性能,可以根据任务的要求选择合适的版本。
EfficientNets显著优于其他ConvNets。特别是,EfficientNet-B7实现了最先进的84.3%的顶级精度,但比GPipe小8.4倍,快6.1倍。EfficientNet-B1比ResNet-152小7.6倍,快5.7倍。
(a) 是一个基线网络示例;(b) -(d)是仅增加网络宽度、深度或分辨率的一个维度的常规缩放。(e) 是我们提出的以固定比率均匀缩放所有三维的复合缩放方法。
放大具有不同网络宽度(w)、深度(d)和分辨率(r)系数的基线模型。宽度、深度或分辨率越大的网络往往会获得更高的精度,但精度增益在达到80%后迅速饱和,这表明了一维缩放的局限性。
单独提升这些指标,都能使得效果有所提升,但是会遇到瓶颈
(FLOPS:例如卷积计算量=HWKKM*N,HW为输出长宽,K是卷积核大小,M为输入特征图的通道数,N为卷积核个数)
所以综合考虑:缩放不同基线网络的网络宽度。线中的每个点表示具有不同宽度系数(w)的模型。所有基线网络均来自下表。第一个基线网络(d=1.0,r=1.0)具有分辨率为224x224的18个卷积层,而最后一个基线(d=2.0,r=1.3)具有分辨率299x299的36个层
EfficientNet-B0基线网络–每行描述一个阶段i,具有Li层(堆叠),输入分辨率为Hi,Wi(分辨率)和输出通道Ci(宽度)
EfficientNet-B0 是 EfficientNet 系列中最小的一个版本,它的网络结构相对较简单,但仍然具有高效性能。以下是 EfficientNet-B0 的主要网络结构细节:
\1. 骨干网络(Backbone:
- EfficientNet-B0 使用了一个经过缩放的骨干网络,该骨干网络基于 MobileNetV2 的架构。MobileNetV2 是一种轻量级卷积神经网络,通常用于移动设备和嵌入式系统。它具有分离卷积、残差连接和批量归一化等特性。
\2. 深度和宽度参数:
- EfficientNet-B0 的深度参数为 1.0,宽度参数为 1.0。这些参数控制网络的深度和通道数,EfficientNet 系列中的不同版本通过调整这些参数来实现不同的网络大小和性能。
\3. 输入分辨率:
- EfficientNet-B0 的默认输入图像分辨率为 224x224 像素。这是一种相对较低的分辨率,适用于移动设备和资源受限的场景。
\4. 特征提取:
- 骨干网络通过一系列卷积层和池化层来提取图像特征。这些特征在后续的任务中用于分类、检测或其他视觉任务。
\5. 全局平均池化:
- EfficientNet-B0 在骨干网络之后通常使用全局平均池化层,将特征图的每个通道进行平均,生成一个固定大小的特征向量,作为最终的图像表示。
\6. 分类头部:
- 最后,EfficientNet-B0 使用一个全连接层或卷积层作为分类头部,将图像特征映射到输出类别的概率分布。
关于shortcut连接,仅当输入MBConv结构特征矩阵与输出的特征矩阵shape相同的时才存在
depthwise convolution
MBConv 模块
SE
计算特征图的权重:首先对输入特征矩阵的feature map的每一个channel进行平均池化操作
,然后在分别通过两个全连接层,先降维再升维,省参数,最后sigmoid把权重分配到01之间,按维相乘
def efficientnet_params(model_name):
""" Map EfficientNet model name to parameter coefficients. """
params_dict = {
# Coefficients: width,depth,res,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),
'efficientnet-b8': (2.2, 3.6, 672, 0.5),
'efficientnet-l2': (4.3, 5.3, 800, 0.5),
}
return params_dict[model_name]