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)技术来搜索网络的图像输入分辨率 rrr,网络的深度 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,rw, d, rw,d,r

在之前的一些论文中:

  • 有的会通过增加网络的宽度width增加卷积核的个数(增加特征矩阵的channels) 来提升网络的性能如图(b)所示

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

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

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

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

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

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

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

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

2. EfficientNet-B0

2.1 EfficientNet-B0网络架构

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

Model Input size width_coefficient depth_coefficient drop_connect_rate dropout_rate
EfficientNet-B0 224×224 1.0 1.0 0.2 0.2
EfficientNet-B1 240×240 1.0 1.1 0.2 0.2
EfficientNet-B2 260×260 1.1 1.2 0.2 0.3
EfficientNet-B3 300×300 1.2 1.4 0.2 0.3
EfficientNet-B4 380×380 1.4 1.8 0.2 0.4
EfficientNet-B5 456×456 1.6 2.2 0.2 0.4
EfficientNet-B6 528×528 1.8 2.6 0.2 0.5
EfficientNet-B7 600×600 2.0 3.1 0.2 0.5
  • width_coefficient代表channel维度上的倍率因子(取整到离他最近的8的整数倍)
  • depth_coefficient代表depth维度上的倍率因子(仅针对Stage2到Stage8的LLL)-> L×depth_coefficientL \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理论讲解相关推荐

  1. MPC控制器设计,模型预测控制,线性时变模型预测控制,LTV MPC,提供理论讲解与应用实现

    MPC控制器设计,模型预测控制,线性时变模型预测控制,LTV MPC,提供理论讲解与应用实现. 提供MPC算法.LTV MPC 算法在直升机和四旋翼中的应用实例. 提供模型预测控制资料. 提供matl ...

  2. 无迹(损)卡尔曼滤波(UKF)理论讲解与实例

    无迹(损)卡尔曼滤波(UKF)理论讲解与实例 文章目录 无迹(损)卡尔曼滤波(UKF)理论讲解与实例 理论讲解 模型对比 UT变换 UKF算法步骤 预测部分 更新部分 应用实例 CTRV模型 预测处理 ...

  3. DCGAN理论讲解及代码实现

    目录 DCGAN理论讲解 DCGAN的改进: DCGAN的设计技巧 DCGAN纯代码实现 导入库 导入数据和归一化 定义生成器 定义鉴别器 初始化和 模型训练 运行结果 DCGAN理论讲解 DCGAN ...

  4. 扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)

    扩展卡尔曼滤波(EKF)理论讲解与实例(matlab.python和C++代码) 文章目录 扩展卡尔曼滤波(EKF)理论讲解与实例(matlab.python和C++代码) 理论讲解 KF和EKF模型 ...

  5. 线程安全的理论讲解(volatile)

     参考:http://blog.csdn.net/xieyuooo/article/details/8639190 在J U C里面,要谈到并发,就必然就存在可见性问题,其实对于程序来讲,要说到锁,首 ...

  6. 全面的SVM理论讲解

    转载自:https://blog.csdn.net/v_july_v/article/details/7624837 前言 动笔写这个支持向量机(support vector machine)是费了不 ...

  7. 史上最简SLAM零基础解读(6) - 卡方分布(chi-square distribution)和()卡方检验(Chi-Squared Test) → 理论讲解与推导

    本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始   文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证{\color{blue}{文末正下方中心}提供了本人 \co ...

  8. ①YOLO v1~v3、②YOLO v3 SPP、③IoU、GIoU、DIoU、CIoU、④Focal Loss的理论讲解

    0. 引言 0.1 安排 YOLO v1 (简单理论) YOLO v2 (简单理论) YOLO v3 (详细理论) YOLO v3 SPP (trick扩充 + 代码讲解) IoU.GIoU.DIoU ...

  9. 集群理论讲解(续三)

    三.RHCS的corosync组件实现HA(高可用). 1.pacemaker作为corosync的插件运行 搭建环境: ms.dtedu.com:管理HA的站点(ansible) node5.dte ...

  10. 第十一集VLAN原理和VTP协议理论讲解

    本视频是Linux系统工程师集训之网络部分视频课程的第十一集. 主要内容为VLAN原理.配置方法.VTP协议讲解,以及相关内容的真机配置. 工作中发现很多搞Linux系统运维的人由于缺乏基础的网络知识 ...

最新文章

  1. tkmybatis 子查询_dnssearch 子域名枚举工具
  2. 3-6-汉诺塔(Hanoi Tower)问题-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版...
  3. Angular rxjs operators 笔记
  4. 动态代理proxy与CGLib的区别
  5. Paxos共识算法详解
  6. vsftp 虚拟用户测试
  7. MySQL之InnoDB存储引擎
  8. 计算机测试穿越,计算机的迷雾,如何穿越?
  9. python手工打码_Python学习--打码平台
  10. python 报警声音的实现
  11. 云心html mac,萤石云视频Mac版
  12. php创建微信公众号管理系统-序言
  13. delete操作对UNDO表空间容量的冲击
  14. 后分布式时代: 多数派读写的「少数派」实现
  15. 掌握el-table的formatter方法,提升数据展示效果
  16. python爬虫:批量刷新网页
  17. android studio 把libs包打包到apk中,设置应用以32bit去读取.so文件
  18. java outer什么意思_java里面outer、 inner是什么意思
  19. App logcat日志分析
  20. Ros 全局规划使用carrot_planner/CarrotPlanner和global_planner/GlobalPlanner

热门文章

  1. mac pycharm如何打开setting
  2. 你为什么总是爱拖延?这个我知道
  3. 大数据HBase(十五):HBase的Bulk Load批量加载操作
  4. c#控件弹幕效果_求C#弹幕游戏弹幕的代码
  5. python入门——快乐的数字
  6. Neural Transducer——李宏毅人类语言学习
  7. Markdown博客系统的搭建与使用
  8. 服务端接入验证苹果支付receipt
  9. 联想s40-70进入bios方法。
  10. javascript 知识点总结