EfficientNet理论讲解

EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks

论文地址:https://arxiv.org/abs/1905.11946
原代码:https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet
霹雳吧啦Wz使用Pytorch实现的代码: pytorch_classification/Test9_efficientNet
霹雳吧啦Wz使用Tensorflow实现的代码: tensorflow_classification/Test9_efficientNet

0. 引言

在之前的一些手工设计网络中(AlexNet,VGG,ResNet等等)经常有人问,为什么输入图像分辨率要固定为224,为什么卷积的个数要设置为这个值,为什么网络的深度设为这么深

这些问题你要问设计作者的话,估计回复就四个字——工程经验。

而这篇论文(EfficientNet)主要是用 NAS(Neural Architecture Search)技术来搜索网络的图像输入分辨率 r r r,网络的深度 depth \text{depth} depth 以及 channel \text{channel} channel 的宽度 width \text{width} width 三个参数的合理化配置。在之前的一些论文中,基本都是通过改变上述3个参数中的一个来提升网络的性能,而这篇论文就是同时来探索这三个参数的影响。

在论文中提到,本文提出的EfficientNet-B7在Imagenet top-1上达到了当年最高准确率84.3%,与之前准确率最高的GPipe相比,参数数量(Params)仅为其1/8.4,推理速度提升了6.1倍(看上去又快又轻量,但个人实际使用起来发现很吃显存)。下图是EfficientNet与其他网络的对比(注意,参数数量少并不意味推理速度就快)。

在这里插入图片描述

图1。模型尺寸与ImageNet精度。所有数据都是单一裁剪,单一模型的。我们的EfficientNets明显优于其他ConvNets。特别是,EffecentNet-B7实现了新的最先进的84.3% top-1精度,但比GPipe小8.4倍,快6.1倍。EffecentNet-B7比ResNet-152小7.6倍,快5.7倍。详情见表2和表4。

1. 论文动机(思想)

1.1 网络性能的三个参数 —— w , d , r w, d, r w,d,r

在这里插入图片描述

在之前的一些论文中:

  • 有的会通过增加网络的宽度width增加卷积核的个数(增加特征矩阵的channels) 来提升网络的性能如图(b)所示
    • 优点:增加网络的width能够获得更高细粒度的特征并且也更容易训练
    • 缺点:对于width很大而深度较浅的网络往往很难学习到更深层次的特征
  • 有的会通过增加网络的深度depth使用更多的层结构来提升网络的性能如图©所示
    • 优点:根据以往的经验,增加网络的深度depth能够得到更加丰富、复杂的特征并且能够很好的应用到其它任务中
    • 缺点:但网络的深度过深会面临梯度消失,训练困难的问题。
  • 有的会通过增加输入网络的分辨率来提升网络的性能如图(d)所示。
    • 优点:增加输入网络的图像分辨率能够潜在得获得更高细粒度的特征模板。
    • 缺点:但对于非常高的输入分辨率,准确率的增益也会减小。并且大分辨率图像会增加计算量。

而在本篇论文中会同时增加网络的width、网络的深度以及输入网络的分辨率来提升网络的性能如图(e)所示。

1.2 单独 w , d , r w, d, r w,d,r时的网络性能

下图展示了在基准EfficientNetB-0上分别增加width、depth以及resolution后得到的统计结果。

在这里插入图片描述

通过下图可以看出大概在Accuracy达到80%时就趋于饱和了。

1.3 固定 w w w,看 d , r d, r d,r对网络性能的影响

接着作者又做了一个实验,采用不同的 d , r d, r d,r 组合,然后不断改变网络的width w w w就得到了如下图所示的4条曲线。

在这里插入图片描述

通过分析可以发现在相同的FLOPs下,同时增加 d d d r r r 的效果最好。

2. EfficientNet-B0

2.1 EfficientNet-B0网络架构

为了方便后续理解,我们先看下论文中通过 NAS(Neural Architecture Search) 技术搜索得到的EfficientNetB0的结构,如下图所示,整个网络框架由一系列Stage组成, F i ^ \hat{F_i} Fi^ 表示对应Stage的运算操作, L i ^ \hat{L_i} Li^表示在该Stage中重复的次数 F i ^ \hat{F_i} Fi^

在这里插入图片描述

MBConv就是MobileNet v3的Block
Resolution中的尺度是针对该stage的输入尺寸(而非输出)。
上表中下采样操作是在MBConv中第一个完成的

2.2 MBConv

在这里插入图片描述

和MobileNet v3中的block是一样的。

Note:

  • 只有使用到shortcut的MBConv才有Dropout层
  • shortcut连接当且仅当MBConv的输入和输出特征图shape相同时才会使用
    当MBConv不进行升维操作时,第一个负责升维的1×1卷积(PWConv)就不要了,直接DWConv(与MobileNet v3是一样的)

2.3 SE模块

在这里插入图片描述

  1. 第一个FC之后是Swish激活函数,第二个FC之后是Sigmoid激活函数
  2. FC降为不是当前feature map channel的1/4而是MBConv输入feature map的1/4

3. EfficientNet所有版本对应参数设置

ModelInput sizewidth_coefficientdepth_coefficientdrop_connect_ratedropout_rate
EfficientNet-B0224×2241.01.00.20.2
EfficientNet-B1240×2401.01.10.20.2
EfficientNet-B2260×2601.11.20.20.3
EfficientNet-B3300×3001.21.40.20.3
EfficientNet-B4380×3801.41.80.20.4
EfficientNet-B5456×4561.62.20.20.4
EfficientNet-B6528×5281.82.60.20.5
EfficientNet-B7600×6002.03.10.20.5
  • width_coefficient代表channel维度上的倍率因子(取整到离他最近的8的整数倍)
  • depth_coefficient代表depth维度上的倍率因子(仅针对Stage2到Stage8的 L L L)-> L × depth_coefficient L \times \text{depth\_coefficient} L×depth_coefficient 向上取整

4. EfficientNet与其他网络的性能对比

在这里插入图片描述

5. 总结

EfficientNet系列的网络虽然有着最高的准确率和参数量,但由于输入图片的尺寸比较大,很占GPU显存,而且实际运行速度并不理想(FLOPs是一个间接指标,真实的推理速度才是直接指标)

参考

  1. https://www.bilibili.com/video/BV1XK4y1U7PX?spm_id_from=333.999.0.0
  2. https://blog.csdn.net/qq_37541097/article/details/114434046
### EfficientNet 架构详解 EfficientNet 的核心理念是在保持计算资源消耗最小化的同时最大化模型性能。为了实现这一目标,该网络采用了复合缩放方法,即同步增加网络宽度、深度以及分辨率,并通过神经架构搜索找到最优的基础网络配置[^2]。 #### 复合缩放法 传统的方法通常只改变单一维度(比如加深层数),而忽视其他因素的影响。相比之下,EfficientNet 提出了一个新的框架——复合系数 φ 来协调这些变量之间的关系: \[ \text{width} = w_0 * (\alpha^\phi),\quad \text{depth}=d_0*(\beta ^{\phi }),\quad \text{resolution}=r_{0}\times(\gamma^{\phi }) \] 其中 \(w_0, d_0\) 和 \( r_0 \) 表示初始设置下的宽度、深度和输入图像大小;\(α, β,\) 及 \(γ\) 则代表各自的增长率;φ 是用于控制整体规模的比例因子。 这种做法使得不同尺寸的模型可以在相同的硬件条件下达到更好的效果,同时也更容易适应各种实际需求场景中的资源限制条件。 ### 应用实例 在多个视觉识别任务上进行了测试验证,结果显示 EfficientNet 不仅能够显著提升分类准确性,在迁移学习方面也表现出色。例如,在 ImageNet 数据集上的实验表明 B7 版本可以取得84.4% top-1 准确度,同时相比之前最好的同类模型减少了约 8 倍 FLOPS (浮点运算次数)。 对于具体的应用开发而言,开发者可以根据自己的项目特点选择合适的预训练权重版本并微调至特定领域内使用。这不仅加快了研发进度而且提高了最终产品的质量和服务水平。 ```python from tensorflow.keras.applications import EfficientNetB0 model = EfficientNetB0(weights='imagenet') ``` 上述代码展示了如何加载一个基于 ImageNet 预训练过的 EfficientNet-B0 模型来进行特征提取或其他高级操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值