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)技术来搜索网络的图像输入分辨率 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模块
- 第一个FC之后是Swish激活函数,第二个FC之后是Sigmoid激活函数
- 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是一个间接指标,真实的推理速度才是直接指标)
参考
- https://www.bilibili.com/video/BV1XK4y1U7PX?spm_id_from=333.999.0.0
- https://blog.csdn.net/qq_37541097/article/details/114434046
EfficientNet理论讲解相关推荐
- MPC控制器设计,模型预测控制,线性时变模型预测控制,LTV MPC,提供理论讲解与应用实现
MPC控制器设计,模型预测控制,线性时变模型预测控制,LTV MPC,提供理论讲解与应用实现. 提供MPC算法.LTV MPC 算法在直升机和四旋翼中的应用实例. 提供模型预测控制资料. 提供matl ...
- 无迹(损)卡尔曼滤波(UKF)理论讲解与实例
无迹(损)卡尔曼滤波(UKF)理论讲解与实例 文章目录 无迹(损)卡尔曼滤波(UKF)理论讲解与实例 理论讲解 模型对比 UT变换 UKF算法步骤 预测部分 更新部分 应用实例 CTRV模型 预测处理 ...
- DCGAN理论讲解及代码实现
目录 DCGAN理论讲解 DCGAN的改进: DCGAN的设计技巧 DCGAN纯代码实现 导入库 导入数据和归一化 定义生成器 定义鉴别器 初始化和 模型训练 运行结果 DCGAN理论讲解 DCGAN ...
- 扩展卡尔曼滤波(EKF)理论讲解与实例(matlab、python和C++代码)
扩展卡尔曼滤波(EKF)理论讲解与实例(matlab.python和C++代码) 文章目录 扩展卡尔曼滤波(EKF)理论讲解与实例(matlab.python和C++代码) 理论讲解 KF和EKF模型 ...
- 线程安全的理论讲解(volatile)
参考:http://blog.csdn.net/xieyuooo/article/details/8639190 在J U C里面,要谈到并发,就必然就存在可见性问题,其实对于程序来讲,要说到锁,首 ...
- 全面的SVM理论讲解
转载自:https://blog.csdn.net/v_july_v/article/details/7624837 前言 动笔写这个支持向量机(support vector machine)是费了不 ...
- 史上最简SLAM零基础解读(6) - 卡方分布(chi-square distribution)和()卡方检验(Chi-Squared Test) → 理论讲解与推导
本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证{\color{blue}{文末正下方中心}提供了本人 \co ...
- ①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 ...
- 集群理论讲解(续三)
三.RHCS的corosync组件实现HA(高可用). 1.pacemaker作为corosync的插件运行 搭建环境: ms.dtedu.com:管理HA的站点(ansible) node5.dte ...
- 第十一集VLAN原理和VTP协议理论讲解
本视频是Linux系统工程师集训之网络部分视频课程的第十一集. 主要内容为VLAN原理.配置方法.VTP协议讲解,以及相关内容的真机配置. 工作中发现很多搞Linux系统运维的人由于缺乏基础的网络知识 ...
最新文章
- tkmybatis 子查询_dnssearch 子域名枚举工具
- 3-6-汉诺塔(Hanoi Tower)问题-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版...
- Angular rxjs operators 笔记
- 动态代理proxy与CGLib的区别
- Paxos共识算法详解
- vsftp 虚拟用户测试
- MySQL之InnoDB存储引擎
- 计算机测试穿越,计算机的迷雾,如何穿越?
- python手工打码_Python学习--打码平台
- python 报警声音的实现
- 云心html mac,萤石云视频Mac版
- php创建微信公众号管理系统-序言
- delete操作对UNDO表空间容量的冲击
- 后分布式时代: 多数派读写的「少数派」实现
- 掌握el-table的formatter方法,提升数据展示效果
- python爬虫:批量刷新网页
- android studio 把libs包打包到apk中,设置应用以32bit去读取.so文件
- java outer什么意思_java里面outer、 inner是什么意思
- App logcat日志分析
- Ros 全局规划使用carrot_planner/CarrotPlanner和global_planner/GlobalPlanner