1.1简介
EfficientNet是由Google Research团队开发的一种高效卷积神经网络(CNN)模型,首次在2019年的论文《EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks》中提出。此模型设计的核心在于平衡网络的深度、宽度以及输入分辨率,以达到更高的计算效率和更优的性能。EfficientNet通过引入复合缩放(Compound Scaling)的概念,对网络结构进行了创新性优化,相较于以往模型,它能够在保持较高精度的同时显著减少模型的参数量和计算成本。
核心组件及技术
-
深度可分离卷积(Depthwise Separable Convolutions):
- 这种卷积方式首先在MobileNet中被广泛应用,它将标准卷积分解为深度卷积(逐通道卷积)和点卷积(1x1卷积)两个步骤,极大地减少了计算量和参数量,提高了模型的效率。
-
自适应空间金字塔池化(Adaptive Average Pooling):
- 在模型的末端,EfficientNet采用了一种全局平均池化策略,即自适应空间金字塔池化,以适应不同尺寸的输入,并有效提取多尺度特征,提升模型的泛化能力。
-
网络缩放系数(Network Scaling):
- EfficientNet提出了复合缩放方法,即不仅仅单独改变网络的深度、宽度或分辨率,而是这三个维度同时按比例调整,但不是等比例缩放。它基于一个复合缩放公式来确定这三个维度的最佳比例,公式为:New Size=Original Size×Scaling Factor𝜙New Size=Original Size×Scaling Factorϕ,其中𝜙ϕ是一个超参数,对于深度、宽度、分辨率分别有不同的值。
-
模型结构:
- EfficientNet的基本结构包含多个模块,每个模块由一系列的MBConv(Mobile Inverted Bottleneck Convolution)块组成,这些块结合了深度可分离卷积、残差连接和膨胀操作,以提高效率和性能。
- 模型按照不同的复杂度和规模,从EfficientNet-B0到EfficientNet-B7,B0是最小的,B7则是最大的。每个变种都是通过调整基础网络的深度、宽度和分辨率得到的,遵循复合缩放原则。
性能特点
- 高效性:相比于其他流行的CNN模型,如ResNet、VGG等,EfficientNet能够在相似的计算成本下达到更高的准确性。
- 可扩展性:通过调整复合缩放的参数,可以方便地生成一系列模型,覆盖从移动端到服务器端的各种应用场景。
- 泛化能力:
- 在ImageNet数据集上的实验显示,EfficientNet取得了当时最好的成绩,不仅提升了准确性,还大幅降低了模型的参数量和计算需求。
- 它也在多个计算机视觉任务中展示了出色的性能,包括物体检测、图像分割等。
应用场景
由于其高效和高性能的特点,EfficientNet广泛应用于图像分类、物体识别、图像生成、医疗影像分析等领域,尤其适合于资源受限的环境,如移动设备和边缘计算。
结论
EfficientNet的出现是对卷积神经网络设计的一次重大革新,它通过精心设计的网络结构和缩放规则,实现了模型效率与性能的最优平衡,成为了现代深度学习领域中的一个重要里程碑。
1.2 网络结构
(d)是提高了图像的分辨率,自然地得到的特征矩阵的高和宽也会相应的增加。
(e)是结合前面的,同时增加网络的宽度,深度,图像分辨率。
EfficientNet-B0(beseline)
表中的卷积层后默认都跟有BN和Swish激活函数。
MBConv就是mobile net convolution。
第三列代表的输入每个stage时的高和宽。
layers是将stage重复多少次。
最右是stride参数,根据分辨率(resolution)信息得到的(若stride=2,对于layer>1的情况只有第一个layer步距为2,其他的都是等于1的)
MBConv(Mobile Inverted Bottleneck Convolution)
-
1x1 Pointwise Convolution (PWConv):这是模块的起始部分,使用1x1卷积核对输入特征图进行升维处理,目的是增加通道数。这一操作有助于减少后续运算的计算成本,因为较宽的特征图在深度可分离卷积时可以更高效地捕获特征。该步骤通常伴随着Batch Normalization (BN)和激活函数(如ReLU或Swish)。
-
Depthwise Convolution (DWConv):紧接着是深度卷积,它使用kxk大小的卷积核,其中k通常为3或5,但EfficientNetV2偏好使用3x3。深度卷积对输入特征图的每个通道独立进行卷积,仅在空间维度上进行滤波,而不是跨通道,这大大减少了参数量。同样,之后会接BN和激活函数。
-
Squeeze-and-Excitation (SE) Layer(部分变体):在某些MBConv变体中,尤其是在EfficientNet的早期版本中,会包含一个Squeeze-and-Excitation层。该层通过先全局平均池化(压缩),然后通过两个全连接层来调整通道间的权重,实现对特征通道的重新校准,增强重要特征,抑制不重要的特征。
-
1x1 Pointwise Convolution (Again):在深度卷积后,再次使用1x1卷积进行降维处理,减少通道数。这一步骤帮助减少模型的复杂度,使得输出特征图的通道数与模块输入相匹配或接近,以便于残差连接。
-
DropConnect(或Dropout):EfficientNet在某些MBConv模块中使用DropConnect来替代传统Dropout,以随机丢弃一些连接而不是整个特征图的神经元,有助于防止过拟合。
-
Residual Connection(残差连接):MBConv模块通常包含一个残差连接,将模块的输入与经过上述操作后的输出相加,以促进梯度流动,加速训练过程,并有助于解决深度网络中的退化问题。
Fused-MBConv模块(EfficientNetV2)
在EfficientNetV2中,引入了Fused-MBConv模块,这是对MBConv的进一步优化。Fused-MBConv将1x1卷积和深度卷积合并成一个操作,减少了内存访问开销,同时降低了扩张率(expansion ratio),使用更小的卷积核尺寸(如3x3代替5x5),进一步提高了模型效率。
效果与目的
MBConv模块通过深度可分离卷积和精心设计的结构,显著减少了模型的参数量和计算量,同时通过残差连接和SE层等机制保持了模型的表达能力,使得EfficientNet能够在保持高效的同时,达到或超越了许多更大、更复杂的模型的性能。这种模块化设计也便于模型的扩展和定制,适应不同计算资源和精度要求的应用场景。
第一个1x1卷积用于升维,这里的n就是之前表格中后面的数字。
后面的1x1卷积用于降维。SE即SE注意力模块。
(注意:在源码中只有使用到shortcut连接的MBConv模块才有Dropout层)
SE(Squeeze-and-Excitation)
SE(Squeeze-and-Excitation)模块是EfficientNet模型中的一个关键组成部分,它最初由Hu等人在2017年提出的SENet中引入,旨在通过动态调整网络中各个通道的重要性来提升模型的特征表示能力。在EfficientNet中,SE模块被集成到MBConv模块中,增强了模型的特征选择能力和效率。下面是SE模块的详细解释:
工作原理
SE模块的主要目的是实现特征的通道注意力机制,具体分为三个步骤:挤压(Squeeze)、激励(Excitation)和重新校准(Re-calibration)。
-
挤压(Squeeze):
- 这一步骤旨在压缩每个特征图的空间信息,转化为通道描述。通过全局平均池化(Global Average Pooling, GAP)操作实现,它将每个通道的所有空间位置上的特征值求平均,得到一个代表该通道整体特征强度的标量。这样,对于一个形状为 H×W×C 的特征图,挤压后得到的特征向量形状变为 1×1×C。
-
激励(Excitation):
- 该阶段的目标是学习每个通道的权重,以此来衡量该通道对于最终任务的贡献度。这通过两个连续的全连接层实现,中间通常伴随非线性激活函数。在EfficientNet中,第一个全连接层(FC1)将通道数降维至输入通道数的1/4(对于MBConv输入的特征图通道数),并使用Swish激活函数;第二个全连接层(FC2)则将通道数恢复到与输入相同,并使用Sigmoid激活函数,以确保输出的权重范围在0到1之间,代表通道的激活程度。
-
重新校准(Re-calibration):
- 最后,利用激励阶段得到的通道权重对原始特征图进行逐通道的加权调整。具体来说,将Sigmoid函数输出的通道权重与原始特征图的每个通道对应相乘,完成特征图的动态加权,增强重要通道的信号,抑制不重要的通道,从而实现特征的精细调制。
目的与效果
SE模块通过上述机制,为网络引入了通道间依赖性,允许网络根据输入内容自动调节不同特征通道的贡献度,从而提升了模型的适应性和表达能力。这种动态调整机制有助于模型在资源有限的情况下,更加高效地利用计算资源,提高模型的性能。在EfficientNet中,SE模块的加入进一步增强了模型的效率-精度权衡,使得模型在保持较小的计算负担的同时,达到了顶尖的图像分类性能。
B1-B7
drop_connect_rate是指1x1降维之后的那个dropout随机失活的比例。
dropout_rate指的是网络最后一个全连接层FC前面的dropout层随机失活比例。
1.3 性能对比
EfficientNet是最准,参数量最少,而且运算次数也最少的。但是EfficientNet有一个问题,就是非常占GPU显存,因为像B4B5B6B7这种模型,它输入的图像分辨率非常大,那么特征矩阵的高和宽都要相应地增加,那么显存也会增加。
1.4 Swish激活函数
Swish激活函数是一种自我门控的激活函数,由谷歌的研究人员在2017年提出,它结合了线性整流单元(ReLU)的简单性和sigmoid函数的自适应性。Swish旨在提高神经网络的性能,尤其是在深度学习任务中,有时表现得比ReLU和其他传统的激活函数更优。
Swish函数的数学表达式为:
Swish函数的优点包括:
- 平滑性:Swish是一个平滑的函数,这意味着它的导数也是连续的,有助于优化过程中的稳定性和泛化能力。
- 无上界且有下界:Swish函数的输出范围从负无穷大到正无穷大,无上界,但有一个下界(当x接近负无穷时,f(x)接近0),这有助于模型学习更广泛的函数关系。
- 自适应性:由于它结合了输入值x和sigmoid函数,Swish能够根据输入的大小自动调整其响应,这意味着在输入值较大或较小时,激活函数的行为会有所不同,提高了模型的灵活性。
- 正则化效果:当输入值远离零时,Swish函数的输出接近输入值x,类似于线性变换;而当输入值接近零时,输出会减小,这有助于模型在训练过程中减少对某些特征的依赖,起到正则化的作用。
Swish函数的这些特性使其在深度学习模型中成为一个吸引人的选择,尤其是在追求高性能和高效率的应用场景中。然而,由于Swish涉及sigmoid函数的计算,相比ReLU等简单激活函数,其计算成本可能会更高。