当前位置: 首页 > news >正文

神经网络学习笔记14——高效卷积神经网络架构EfficientNet

系列文章目录


文章目录

  • 系列文章目录
  • 前言
    • 模型的发展
      • 更大更强
      • ​​更小更快
    • 高效卷积神经网络架构
      • 模型名称
      • 参数量
      • 乘加运算量
      • 评价指标
      • 高效卷积神经网络的比较
  • 一、EfficientNet
    • 1、EfficientNet V1
      • 1.网络宽度、深度与分辨率
      • 2.具体的复合模型缩放方法
      • 3.层结构与模型结构
    • 2、EfficientNet lite
      • 1.激活函数
      • 2.​​注意力机制​​
    • 3、EfficientNet V2
      • 1.EfficientNet V1训练瓶颈
      • 2.层结构与模型结构
  • 总结


前言

模型的发展

从2012年发展至今,神经网络模型经历了从卷积神经网络CNN到注意力机制Transformer等范式性的演进。然而,贯穿始终的核心研究驱动力始终围绕着两个相辅相成又看似矛盾的方向:

更大更强

追求模型的​​极致能力​​和​​认知边界突破​​。
能够学习更多的信息,捕捉更细的特征,提升泛化能力,解决开放域问题等。
目的是为了能处理更复杂的任务,比如通用人工智能、自然语言理解与生成、科学计算模拟等。主要通过增大模型参数规模、增加训练数据量、构建复杂的架构以及优化训练技术来实现这一目标。

​​更小更快

​​追求模型的​​实用效率​​和​​普适部署​​。
能够为了在能维持一定精度的前提下减少参数量和运算量。
目的是满足边缘/终端设备的低功耗、实时性、低成本、隐私保护要求,降低云端推理成本、提高响应速度,主要通过设计更高效的模型架构,进行裁剪、量化、蒸馏对模型进行压缩,优化特定算子和结合AI硬件加速来实现这一目标。

高效卷积神经网络架构

在这里插入图片描述

模型名称

表示轻量化神经网络模型的名称,名称中包含着几个重要信息:
1、不同的架构家族 (如 squeezenet, Mobilenet, ShuffleNet, EfficientNet, GhostNet, DeiT, ConvVT)。
2、不同的版本/变体标识 (如V1, V2, V3)。
3、不同的规模/宽度乘子 (如 0.5, 0.75, 1.0, 1.5x, 2x, -Small, -Large)。
4、其他配置参数 (如 160, 224 通常指输入图像的尺寸, g=3/8 对 ShuffleNet 指分组卷积的分组数,还有像b0/b1/b2/b3、S/M/L、A1/A2/A3、lite0/lite1/lite2/lite3/lite4等模型设置,特指不同尺寸或者不同复杂度)。

参数量

​​参数量是指模型中需要学习的参数总数。
1、参数量决定模型的内存占用(如显存和内存)和数据加载和传输时间,参数需从内存频繁读取到计算单元,高参数量可能导致​​内存带宽瓶颈​​,拖慢推理速度(尤其在移动设备)。
2、参数量与模型的​​复杂度、学习能力和表达能力有紧密关系(通常参数越多,模型越复杂,理论上拟合能力越强)。
3、参数量也是衡量模型​​“轻量化”​​程度的最关键指标之一,轻量化模型的核心目标就是在保持一定性能的前提下,尽可能减少参数量。​​

乘加运算量

乘加运算量是指模型进行一次前向推理(处理一张图片)所需完成的 ​​乘法累加操作的总次数。一次乘加运算通常指 a * b + c 这样的计算。​​
1、乘加运算量是衡量模型​​计算复杂度​​和​​推断速度​​(尤其是在硬件上)的最常用指标之一,与模型的​​耗电量​​(对移动设备尤为重要)强相关。
2、乘加运算量是衡量模型​​“轻量化”​​程度的核心指标,直接决定计算时间(如GPU/CPU的浮点运算耗时),需要在满足性能要求下降低此值。
​​3、神经网络中的主要计算(如卷积、全连接层)绝大部分都是由大量的乘加操作构成的,统计乘加次数能有效反映整体的计算负担。

评价指标

ImageNet fp32 top1 accuracy评价指标是衡量不同轻量化模型分类​​准确性的核心依据。它直观地告诉我们在识别 1000 类物体时,模型猜中“第一名”的概率是多少。用户可以通过这个值直接比较不同模型在相同的权威数据集和评估标准下的表现优劣。数值越高越好。

1、fp32是模型在运行/评估时使用的​​数值精度​​,代表 ​单精度浮点数(Single-precision floating-point format)​​,是一种在计算机中表示实数的格式,使用 32 位(4 字节)存储一个数字。有些轻量化模型在部署时可能会使用更丰富的精度选择,比如fp16、int8、int4、int2以及混合精度,通过对模型量化以加速和减小模型体积,但在学术论文和基准对比中,通常报告 fp32 精度以保证公平比较。

2、​​ImageNet数据集是一个巨大的、公开的​​图像数据集​​,具体是指 ​​ILSVRC 2012​​ 数据集(ImageNet Large Scale Visual Recognition Challenge 2012)。它包含超过 ​​140万​​ 张训练图像,​​5万​​ 张验证图像,​​10万​​ 张测试图像,涵盖了 ​​1000 个不同的物体类别​​(如“猫”、“狗”、“汽车”、“杯子”等)。

3、top1 accuracy是评估图像分类任务最直接、最重要的​​性能指标​​。在推理过程中对验证/测试集中的每一张图片都会输出一个包含 1000 个类别的​​概率分布也就是置信度​。而​​top1 accuracy指的是模型预测的​​概率最高的那个类别恰好等于图片真实标签的比例​​。有时还会使用top5 accuracy​​,它指的是​​图片的真实标签出现在模型预测的前5个最高概率类别之中的比例​​。​​

高效卷积神经网络的比较

在这里插入图片描述

在这里插入图片描述


一、EfficientNet

1、EfficientNet V1

EfficientNet V1论文地址

1.网络宽度、深度与分辨率

在这里插入图片描述
a)baseline基线模型
假设是一个设计成熟的初始模型,它的​​宽度​​、​​深度和​​分辨率​​都有固定的初始值。往后的所有改动都是基于该模型结构进行的。
resolution H×W:固定的输入分辨率。
layer_i:固定的模型层数。
#channels:固定的通道数。

b)width scaling宽度缩放​
修改基线模型,增加模型每一层的通道数,深度和分辨率不作修改。
width:增加后的通道数。

增加网络的通道数能够学习到更多信息的特征,对于较浅的网络模型也更容易训练。
但通道数过大且深度较浅的网络很难学习到更深层次的特征,精度的提升有限,容易饱和。

c)depth scaling深度缩放
修改基线模型,加深模型的网络层数,宽度和分辨率不作修改。
deeper:加深后的网络层数。

增加网络的深度能够得到更加丰富、复杂的特征。
但网络层数过深会面临梯度消失,训练困难的问题。

d)resolution scaling分辨率缩放​
修改基线模型,扩大模型的输入图像的分辨率,宽度和深度不作修改。
higher resolution:扩大后的输入分辨率。

增加输入网络的输入分辨率能够获得更高细粒度的特征信息。
但过高的输入分辨率,计算量会呈平方级增长,参数量也会增多。

d)compound scaling复合缩放
修改基线模型,增加模型每一层的通道数,加深模型的网络层数,扩大模型的输入图像的分辨率。

​​深度、宽度和分辨率这三个维度是相互依赖的​​,更高的分辨率需要更深的网络来增加感受野,也需要更宽的网络来捕捉更细粒度的特征。单独缩放任何一个维度,模型性能都会很快达到瓶颈。

2.具体的复合模型缩放方法

max⁡d,w,rAccuracy(N(d,w,r))\max_{d,w,r} \ \ Accuracy(N(d,w,r))d,w,rmax  Accuracy(N(d,w,r))
N(d,w,r)=⨀i=1...sF^id⋅L^i(X(r⋅H^i,r⋅W^i,w⋅C^i))N(d,w,r) =\bigodot_{i=1...s}\hat{F}_i^{d\cdot\hat{L}_i}(X_{(r\cdot\hat{H}_i,r\cdot\hat{W}_i,w\cdot\hat{C}_i)})N(d,w,r)=i=1...sF^idL^i(X(rH^i,rW^i,wC^i))
Memory(N)≤target_memoryMemory(N)≤target\_memoryMemory(N)target_memory
FLOPs(N)≤target_flopsFLOPs(N)≤target\_flopsFLOPs(N)target_flops

NNN:表示神经网络N。
d,w,rd,w,rd,w,r:表示深度系数d、宽度系数w、分辨率系数r三个复合缩放参数。
⨀i=1...s\bigodot_{i=1...s}i=1...s:表示连续堆叠,i代表网络的​​阶段模块。
F^i\hat{F}_iF^i:表示第i个阶段的​​基础模块或​​卷积层。
L^i\hat{L}_iL^i:表示第 i个阶段​​重复F^i\hat{F}_iF^i块的次数。
XXX:表示输入到第i个阶段的​​特征矩阵​​。
H^i,W^i,C^i\hat{H}_i,\hat{W}_i,\hat{C}_iH^i,W^i,C^i:表示第 i个阶段的​​特征图高度H、宽度​W和通道数​​C。
max Accuracy:表示​​训练并评估​​网络N后得到的最优精度。
FLOPs(N):表示​网络N完成一次前向传播所需的​​浮点运算次数​​。
​​Memory(N)​​:表示网络N运行时所需要占用的​​内存​​。
target_memory:表示预先设定的memory限制。
target_flops:表示预先设定的FLOPs限制。

对于输入到第i个阶段的​​特征矩阵X,使用分辨率系数r对特征矩阵的宽高进行缩放,使用宽度系数w对特征矩阵的通道数进行缩放。缩放后的特征矩阵X在基础模型F^i\hat{F}_iF^i中​​重复学习受深度系数缩放影响的d⋅L^id\cdot\hat{L}_idL^i次,最后按照不同阶段顺序进行堆叠,最终构成了完整的神经网络N(d,w,r)N(d,w,r)N(d,w,r)

该公式的目的是寻找最优的缩放参数(d, w, r),使得由这些参数缩放后生成的神经网络 N的​​准确率(Accuracy)最高。但是要求要满足约束条件,就是​缩放后的网络N其​​计算复杂度(FLOPs)​​ 和​​内存占用(Memory)必须分别小于预先设定的目标值target_flops和target_memory。并不是随意地增加网络的深度、宽度或分辨率,而是通过这个数学公式,​​系统性地​​且​​在计算资源与内存的严格约束下​​,搜索出同时缩放这三个维度的最佳比例,从而得到最高精度的模型。

在这里插入图片描述
以MobileNet V3为基线模型,使用的是MBConv模块,使用深度、宽度、分辨率和复合方案对模型进行不同的修改,对训练出来的不同模型进行比对,对比结果如上图所示。

3.层结构与模型结构

在这里插入图片描述

input​​:表示输入特征图。
​​1×1 Conv​​:表示1×1标准卷积,作用是​​通道数升维。
​​SiLU:表示Swish激活函数,曲线连续且光滑,x>0时具有线性,x<0时具有非线性。
​​3×3 DWConv:表示​​3×3深度可分离卷积,作用是提取特征图的空间特征。
GAP​​:表示全局平均池化Global Average Pooling,作用是把空间信息压缩为一维特征向量。
​​FC1:表示全连接层,作用是降维和捕获通道间的关系。
​​FC2:表示全连接层,作用是恢复原始的通道维度。
​​Sigmoid:表示Sigmoid激活函数,作用是将输出权重归一化到[0, 1]之间,计算每个通道的权重参数。
⨂\bigotimes:表示Scale操作,作用是将得到的权重逐通道乘回深度卷积后的特征图上,突出重要通道抑制不重要通道。
1×1 Conv​​:表示1×1标准卷积,作用是​​通道数降维。
​​Stochastic Depth​​:表示深度方向正则化技术,作用是随机简化网络深度,增强泛化能力
⨁\bigoplus:表示Shortcut(Add)操作,作用是将输入特征​​直接​​与核心路径输出相加,实现残差跳跃连接,要求输入与输出维度相同。
output​​​​:表示输出特征图。

Dropout机制是在且只在训练中以一定概率将某个神经元输出置零,目的​是防止全连接层过拟合,促进神经元独立学习。
​​Stochastic Depth机制也叫DropConnect机制,在且只在训练中以一定概率直接丢弃整个MBConv块,仅保留捷径分支。目的是随机简化网络深度,模拟集成学习效果,增强泛化能力,并在一定程度上缓解梯度消失问题,帮助训练更深的网络。

这是一个带SE模块的MBConv模块,其中MBConv模块就是倒残差移动瓶颈块,而GAP​​→ FC1→SiLU→ FC2→Sigmoid​​→⨂\bigotimes操作构成的就是​​SENet注意力模块​​。

在这里插入图片描述
Stage:表示网络的不同阶段。
Operator:表示该阶段所使用的网络模块或算子。
Resolution:表示该阶段输入特征图的分辨率
Channels:表示该阶段输出特征图的通道数。
Layers:表示该阶段Operator块重复堆叠的次数,也就是模型的网络层数。
MBConvX:表示倒残差移动瓶颈块,其中X表示扩展因子,通过1×1标准卷积将输入通道数扩展为原来的X倍。k表示DWConv使用的卷积核大小,主要使用3×3和5×5大小的卷积核。
Conv1×1 & Pooling & FC​:表示网络的​​头部Head,使用1×1卷积对通道数进行升维以整合所有特征,接着进行全局池化Pooling将每个通道的二维特征图压缩成一个标量,最后通过全连接层FC输出分类结果。
Stride:表示步长,在模块的第一个3×3 Conv或DWConv中会使用Stride=2操作进行下采样,这与Resolution相互对应,分别位于Stage1、Stage3、Stage4、Stage5、Stage7阶段。

以上模型网络名为EfficientNet-B0模型,是整个EfficientNet系列的​​基础网络,通过复合缩放方法对模型进行调整,从而衍生出性能更强的EfficientNet-B1到B7模型。
图片来源
在这里插入图片描述

EfficientNet V1网络模型的性能参数对比图:
在这里插入图片描述

2、EfficientNet lite

EfficientNet-lite网络模型脱胎于EfficientNet V1网络模型,是 Google 专门为手机、IoT等边缘设备和 CPU平台推理优化的“硬件友好”版本。

1.激活函数

在EfficientNet-lite网络模型中,使用Relu6激活函数替代SiLU激活函数,SiLU激活函数激活复杂度高,并且对量化有不利影响。将其全部替换为ReLU6激活函数​​。

对于ReLU6激活函数而言,当输入值小于0的时候,默认都将它置0。在[0,6]区间内,不会改变它的输入值,但是当输入值大于6的时候,就会将输出值置为6。

ReLU6激活函数是移动端推理的“黄金标准”,计算简单,所有硬件都对其有极致优化,并且其截断特性(min(max(0, x), 6))在量化时能保持数值稳定性。

2.​​注意力机制​​

在EfficientNet-lite网络模型中,去除SE模块,简化结构,减少内存访问。

对于SE模块而言,需要在整个特征图上进行全局平均池化和大量广播操作,将向量扩展到整个空间尺寸,大量细碎的操作也会增加内存访问开销,对 CPU 缓存不友好。

移除SE模块虽然损失了一点精度,但换来巨大的速度提升,使EfficientNet-lite网络模型更适合在边缘设备上高效运行。

EfficientNet-lite相对于EfficientNet V1虽然牺牲了少量理论精度,却换来了在边缘设备上巨大的速度和易用性的提升​​。

3、EfficientNet V2

EfficientNet V2论文地址

1.EfficientNet V1训练瓶颈

使用大分辨率图像进行训练会很慢:
总所周知,大尺度图像需要消耗更多的内存成本,而训练平台GPU和TPU的总内存是固定的,同样的内存总量能支持的小尺度图像数量比大尺度图像的数量更多。所以图像的尺寸越小,模型的FLOPs和内存访问成本越小,batch批量越大,能提高的训练速度越多。

在以下图表中,512×512输入和380×380输入的模型准确率相近,但是512×512输入在GPU和TPU中在小batch中还能运行,但是在大batch中会报爆显存OOM。而380×380输入在GPU和TPU中在小batch中也能运行,且每秒能处理的batch个数会比512×512输入更多,在大batch中不会爆显存OOM。
在这里插入图片描述

深度卷积在模型后期阶段计算高效,但在模型早期阶段计算缓慢:
虽然DW Conv相比标准卷积拥有更少的参数以及更小的FLOPs,但算子未必能有很好的支持,在模型早期,通道数较少,使用标准卷积进行计算会更快。在模型后期,通道数较多,使用DW Conv进行计算会更快。

No fused不使用标准卷积,相对其他方案而言,参数量和浮点运算次数最少,但是在GPU和TPU中每秒能处理的batch个数是最少的。
Fused stage 1-3中使用标准卷积,相对No fused而言,参数量和浮点运算次数会少量增加,在GPU和TPU中每秒能处理的batch个数明显增多。
Fused stage 1-5中使用标准卷积,相对Fused stage 1-3而言,参数量和浮点运算次数会明显增加,在GPU和TPU中每秒能处理的batch个数少量增多。
Fused stage 1-7中使用标准卷积,相对Fused stage 1-5而言,参数量和浮点运算次数会大量增加,在GPU和TPU中每秒能处理的batch个数反而下降。
在这里插入图片描述

不过现代GPU对DW Conv算子提供了专门的硬件加速支持,所以这个问题会有所改善,不需要很担忧。只不过计算密度相对较低,可能会受内存带宽制约,频繁的内存访问可能导致实际FLOPS效率低于理论值。

平均放大每个阶段是次优的:
在EfficientNet V1中,使用简单的复合缩放策略对每个stage的深度和宽度都进行了同等放大。但每个stage对网络的训练速度以及参数数量的贡献并不相同,所以直接使用同等缩放的策略并不合理,应该使用非均匀复合缩放策略。

2.层结构与模型结构

在这里插入图片描述

MBConv 结构:
第一层(Conv1×1):1×1 标准卷积,通道数升维,从C→4C。
​​第二层(depthwise conv3×3):3×3 DW卷积,进行特征提取,通道数保持不变​。
第三层(SE):SE 注意力模块,突出重要通道,抑制不重要通道。
​​第四层(Conv1×1):1×1 标准卷积,通道数降维,从4C→C。
​​跳跃连接⨁\bigoplus:输入特征​​直接​​与核心路径输出相加,要求输入与输出维度相同。

Fused-MBConv 结构:
第一层(Conv3×3):3×3标准卷积,通道数升维,从C→4C,同时进行特征提取。
​​第二层(SE):SE 注意力模块,突出重要通道,抑制不重要通道。
​​第三层(Conv1×1):1×1 PW卷积,通道数降维,从4C→C。
​​跳跃连接⨁\bigoplus:输入特征​​直接​​与核心路径输出相加,要求输入与输出维度相同。

在MBConvde的倒残差结构中,深度可分离卷积由DWConv和PWConv操作组成,虽然FLOPs计算量很低,但在GPU等具有高并行计算能力的硬件上,其内存访问效率并不高。
一个融合的、更大的标准卷积操作往往能更充分地利用GPU的并行计算能力,从而​​实际运行速度更快​​。

在网络模型结构的浅层,特征图尺寸较大,通道数较少,使用此阶段MBConv需要计算三次卷积,而Fused-MBConv需要只需要计算两次卷积。
在网络的​​浅层使用Fused-MBConv​​,在​​深层继续使用高效的MBConv​​,实现了速度和精度的完美平衡。

在这里插入图片描述
Stage:表示网络的不同阶段。
Operator:表示该阶段所使用的网络模块或算子。
Stride:表示步长,在模块的第一个3×3 Conv或DWConv中会使用Stride=2操作进行下采样。
Channels:表示该阶段输出特征图的通道数,实际的模型实现的时候通道数又进行了调整,与表格不完全一致。
Layers:表示该阶段Operator块重复堆叠的次数,也就是模型的网络层数。
Fused-MBConvX:表示倒残差移动瓶颈块,其中X表示扩展因子,通过3×3标准卷积对通道数升维的同时进行特征提取,通过SE 注意力模块计算通道权重,通过1×1标准卷积对通道数降维。
MBConvX:表示倒残差移动瓶颈块,其中X表示扩展因子,通过1×1标准卷积对通道数升维,通过3×3DWConv进行特征提取,通过SE注意力模块计算通道权重,通过1×1标准卷积对通道数降维。
SE0.25:SE通道注意力机制主要由GAP​​→ FC1→SiLU→ FC2→Sigmoid​​→⨂\bigotimes等操作组成,为了降低模型的复杂度和参数量,​​第一个全连接层FC1会进行降维,所以第一个全连接层的输出神经元个数 = 输入通道数 C × 0.25​​​,不过在实现的时候Fused-MBConv和MBConv模块没有使用SE模块,以减少模型的内存访问开销。
Conv1×1 & Pooling & FC​:表示网络的​​头部Head,使用1×1卷积对通道数进行升维以整合所有特征,接着进行全局池化Pooling将每个通道的二维特征图压缩成一个标量,最后通过全连接层FC输出分类结果。
​​

Stage 0: 初始阶段,对原始输入图像进行第一次下采样和通道升维​,同时进行快速特征提取。
Stage 1 ~ 3: 早期阶段,连续使用Fused-MBConv加速构建特征图,保持精度的同时提升计算速度。
Stage 4 ~ 6: 中后期阶段,连续使用MBConv更快更好地提取和融合复杂特征,保证模型的精度和容量。

EfficientNet V2网络模型的性能参数对比图:
在这里插入图片描述


总结

EfficientNet V1 通过复合缩放方法实现更高精度与更低参数量,其基础架构为移动端优化的MobileNetV2-like的MBConv。

EfficientNet V2 在V1基础上,重点改进训练速度与参数效率。主要创新包括:使用更快的Fused-MBConv模块、引入渐进式训练、并针对训练中的内存瓶颈进行优化。V2模型在保持高精度的同时,训练速度显著快于V1,成为更高效的网络家族。

两者核心思想都是在精度、效率与速度间寻求最优平衡。

http://www.dtcms.com/a/391358.html

相关文章:

  • Flutter实现滑动页面停留吸附
  • 【Linux】基本指令介绍
  • 爬虫逆向--Day22Day23--核心实战案例【荔枝网】【WASM学习】----待完成
  • 【软考-系统架构设计师】特定领域软件体系结构(DSSA)
  • idea git使用提示问题处理
  • 数据结构初阶——哈希表的实现(C++)
  • Problem: lab-week3- exercise01 Insertion sort
  • 金融级虚拟机安全:虚拟化平台5大安全风险与国产化防护实践
  • 可视化在智慧城市中的应用
  • C#实现高性能拍照(旋转)与水印添加功能完整指南
  • Pandas 2.x与PyArrow:深入探索内存优化与性能提升技巧
  • opencv之轮廓识别
  • lesson65:JavaScript字符串操作完全指南:从基础到高级实战
  • 【脑电分析系列】第19篇:深度学习方法(一):卷积神经网络(CNN)在EEG图像/时频图分类中的应用
  • 写文件的几种方法
  • 序列化与反序列化漏洞及防御详解
  • uniapp 锁定竖屏,固定竖屏,锁定屏幕
  • 论文解读 | Franka 机器人的 CRISP-ROS2 集成实践:适配学习型操作策略与遥操作
  • Redis数据库(二)—— Redis 性能管理与缓存问题解决方案指南
  • TCP KeepAlive判断离线的记录
  • Ceph 测试环境 PG_BACKFILL_FULL
  • 维星AI的GEO搜索优化:企业在AI时代的可见度突围之道
  • Abp Vnext 数据库由SQL server切换MySQL
  • Linux嵌入式自学笔记(基于野火EBF6ULL):4.gcc
  • Mellanox网卡寄存器PPCC
  • [vibe code追踪] 应用状态管理 | 交互式点击 | 共享白板
  • SG-TCP232-110 单通道串口服务器,一键实现串口与以太网双向转换
  • 零基础入门神经网络:从数学公式到通俗理解
  • 坤驰科技诚邀您参加——第十三届中国光纤传大会
  • 如何找到高质量的Java项目教程?