EfficientNet 简介
目录
- EfficientNet
- 网络结构
- MBConv 结构
EfficientNet
单独适当增大深度、宽度或分辨率都可以提高网络的精确性,但随着模型的增大,其精度增益却会降低。此外,这三个维度并不是独立的(如:高分辨率图像需要更深的网络来获取更细粒度特征等),需要我们协调和平衡不同尺度的缩放,而不是传统的一维缩放。EfficientNet 的设想就是能否设计一个标准化的卷积网络扩展方法,既可以实现较高的准确率,又可以充分的节省算力资源。其通过 NAS(Neural Architecture Search)技术来搜索网络的图像输入分辨率 r,网络的深度 depth 以及 channel 的宽度 width 三个参数的合理化配置。
- 增加网络的深度 depth 能够得到更加丰富、复杂的特征并且能够很好的应用到其它任务中。但网络的深度过深会面临梯度消失,训练困难的问题
- 增加网络的 width 够获得更高细粒度的特征并且也更容易训练,但对于 width 很大而深度较浅的网络往往很难学习到更深层次的特征
- 增加输入网络的图像分辨率能够潜在地获得更高细粒度的特征模板,但对于非常高的输入分辨率,准确率的增益也会减小。并且大分辨率图像会增加计算量
第i个层的操作可以看成映射函数:Yi=Fi(Xi)若网络N由k个层组成的,则可表示为:N=Fk⨀...⨀F2⨀F1(X1)=⨀j=1...kFi(X1)论文中对整个网络的运算进行抽象:N=⨀i=1...sFiLi(X<Hi,Wi,Ci>)\begin{aligned} &第 i 个层的操作可以看成映射函数:Y_i = F_i(X_i) \\ &若网络 N 由 k 个层组成的,则可表示为:N = F_k \bigodot ... \bigodot F_2 \bigodot F_1(X_1) = \bigodot_{j=1...k}F_i(X_1) \\ &论文中对整个网络的运算进行抽象:N = \bigodot_{i=1...s}F_i^{L_i}(X_{<H_i, W_i, C_i>}) \\ \end{aligned} 第i个层的操作可以看成映射函数:Yi=Fi(Xi)若网络N由k个层组成的,则可表示为:N=Fk⨀...⨀F2⨀F1(X1)=j=1...k⨀Fi(X1)论文中对整个网络的运算进行抽象:N=i=1...s⨀FiLi(X<Hi,Wi,Ci>)
注:FiLiF_i^{L_i}FiLi 表示在 stage(i)stage^{(i)}stage(i) 中 FiF_iFi 被重复执行了 LiL_iLi 次,X 表示输入 stage(i)stage^{(i)}stage(i) 的特征矩阵,其维度是 <Hi,Wi,Ci><H_i,W_i,C_i><Hi,Wi,Ci>。
为了探究 d, r, w 这三个因子对最终准确率的影响,则将 d, r, w 加入到公式中,我们可以得到抽象化后的优化问题
maxd,w,rAccuracy(N(d,w,r))s.t.N(d,w,r)=⨀i=1...sFid⋅Li^^(X<r⋅Hi^,r⋅Wi^,ω⋅Ci^>)Memory(N)≤target_memoryFLOPS(N)≤target_flops\begin{aligned} &\max_{d, w, r}Accuracy(N(d, w, r))\\ &s.t.\quad 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}, \omega \cdot \hat{C_i}>}) \\ &Memory(N) \leq target\_memory \\ &FLOPS(N) \leq target\_flops \\ \end{aligned} d,w,rmaxAccuracy(N(d,w,r))s.t.N(d,w,r)=i=1...s⨀Fid⋅Li^^(X<r⋅Hi^,r⋅Wi^,ω⋅Ci^>)Memory(N)≤target_memoryFLOPS(N)≤target_flops
注:d 用来缩放深度 Li^\hat{L_i}Li^;rrr 用来缩放分辨率即影响 Hi^\hat{H_i}Hi^ 和 Wi^\hat{W_i}Wi^;ω\omegaω 用来缩放特征矩阵的 channel 即 Ci^\hat{C_i}Ci^。
接着作者又提出了一个混合缩放方法 ( compound scaling method) 在这个方法中使用了一个混合因子 ϕ 去统一的缩放 width,depth,resolution 参数,具体的计算公式如下:
depth:d=αϕwidth:w=βϕresolution:r=γϕs.t.α⋅β2⋅γ2≈2α≥1,β≥1,γ≥1\begin{aligned} &depth: d = \alpha^\phi \\ &width: w = \beta^\phi \\ &resolution: r = \gamma^\phi \\ &s.t. \quad \alpha \cdot \beta^2 \cdot \gamma^2 \approx 2 \qquad \alpha \geq1, \beta \geq 1, \gamma \geq 1 \\ \end{aligned} depth:d=αϕwidth:w=βϕresolution:r=γϕs.t.α⋅β2⋅γ2≈2α≥1,β≥1,γ≥1
注:FLOPs(理论计算量)=> depth 翻倍,也翻倍(一次);width 或 resolution 翻倍,则翻四倍(平方)。总的FLOPs倍率可以用近似用 (α,β2,γ2)ϕ(\alpha, \beta^2, \gamma^2)^\phi(α,β2,γ2)ϕ 来表示,当限制 α⋅β2⋅γ2≈2\alpha \cdot \beta^2 \cdot \gamma^2 \approx 2α⋅β2⋅γ2≈2 时,对于任意一个 ϕ\phiϕ 而言 FLOPs 相当增加了 2ϕ2^{\phi}2ϕ 倍。对于不同的基准网络搜索出的 α,β,γ\alpha, \beta, \gammaα,β,γ 也不一定相同。
网络结构
下表为EfficientNet-B0的网络框架(B1-B7就是在B0的基础上修改 Resolution、Channels 和 Layers),第一个 Stage 就是一个卷积核大小为 3x3 步距为 2 的普通卷积层(包含 BN 和激活函数 Swish),Stage2~Stage8 都是在重复堆叠 MBConv 结构(最后一列的 Layers 表示该 Stage 重复 MBConv 结构多少次),而 Stage9 由一个普通的 1x1 的卷积层(包含 BN 和激活函数 Swish)、一个平均池化层和一个全连接层组成。表格中每个 MBConv 后会跟一个数字 1 或 6,这里的 1 或 6 就是倍率因子 n 即 MBConv 中第一个 1x1 的卷积层会将输入特征矩阵的 channels 扩充为 n 倍,其中 k3x3 或 k5x5 表示 MBConv 中 Depthwise Conv 所采用的卷积核大小。Channels 表示通过该 Stage 后输出特征矩阵的 Channels。
MBConv 结构
如图所示,MBConv 结构主要由一个 1x1 的普通卷积(升维作用),一个 kxk 的 Depthwise Conv 卷积。k 的具体值主要有 3x3 和 5x5 两种情况,一个 SE 模块,一个 1x1 的普通卷积(降维作用),一个 Droupout 层构成
- 第一个升维的 1x1 卷积层,它的卷积核个数是输入特征矩阵 channel 的 n 倍,n ∈ { 1 , 6 }
- 当 n = 1 时,不要第一个升维的 1x1 卷积层,即 Stage2 中的 MBConv 结构都没有第一个升维的 1x1 卷积层?
- 仅当输入 MBConv 结构的特征矩阵与输出的特征矩阵 shape 相同时才存在 shortcut 连接
- 在源码实现中只有使用 shortcut 的时候才有 Dropout 层
Model | input_size | width_coefficient | depth_coefficient | drop_connect_rate | dropout_rate |
---|---|---|---|---|---|
EfficientNetB0 | 224x224 | 1.0 | 1.0 | 0.2 | 0.2 |
EfficientNetB1 | 240x240 | 1.0 | 1.1 | 0.2 | 0.2 |
EfficientNetB2 | 260x260 | 1.1 | 1.2 | 0.2 | 0.3 |
EfficientNetB3 | 300x300 | 1.2 | 1.4 | 0.2 | 0.3 |
EfficientNetB4 | 380x380 | 1.4 | 1.8 | 0.2 | 0.4 |
EfficientNetB5 | 456x456 | 1.6 | 2.2 | 0.2 | 0.4 |
EfficientNetB6 | 528x528 | 1.8 | 2.6 | 0.2 | 0.5 |
EfficientNetB7 | 600x600 | 2.0 | 3.1 | 0.2 | 0.5 |
- width_coefficient 代表 channel 维度上的倍率因子,比如在 EfficientNetB0 中 Stage1 的 3x3 卷积层所使用的卷积核个数是 32,那么在 B6 中就是 32 × 1.8 = 57.6,接着取整到离它最近的 8 的整数倍即 56
- depth_coefficient 代表 depth 维度上的倍率因子(仅针对Stage2到Stage8),比如在 EfficientNetB0 中 Stage7 的 \hat{L_i} = 4,那么在 B6 中就是 4 × 2.6 = 10.4 接着向上取整即 11
- drop_connect_rate 是在 MBConv 结构中 dropout 层使用的 drop_rate
- dropout_rate 是最后一个全连接层前的 dropout 层
补充:EfficientNet、EfficientNet网络详解、【一看就懂】EfficientNet详解。凭什么EfficientNet号称当今最强?、Depthwise卷积与Pointwise卷积
EfficientNet 简介相关推荐
- 集效率之大成的EfficientNet
基于EfficientNet实现分类任务 目录 基于EfficientNet实现分类任务 EfficientNet简介 算法解析 模型优化目标 模型缩放算法 模型结构 MBConv结构 ConvNor ...
- 基于深度学习的岩石样本智能识别研究——第九届“泰迪杯”挑战赛B题优秀作品
1 前言 1.1 研究背景 岩石是现代建筑业和制造业的重要原材料,除了作为原材料使用以外,还可以对其进行勘探开发挖掘岩油气藏,若能智能且准确地识别岩石岩性.计算岩石含油量,这将会是一笔巨大的社会财富. ...
- 独家 | 使EfficientNet更有效率的三种方法(附链接)
作者:Dominic Masters翻译:王可汗校对:欧阳锦本文约3300字,建议阅读5分钟本文为大家介绍了提升EffcientNet效率和性能的三个策略. 在实践中有更好性能的EfficientNe ...
- AI:人工智能的多模态融合模型的简介、发展以及未来趋势
AI:人工智能的多模态融合模型的简介.发展以及未来趋势 目录 人工智能的多模态融合模型的简介.发展以及未来趋势 多模态融合模型的简介 多模态融合模型的发展趋势 多模态常见应用分类 1.按照模态分类 2 ...
- yolov8 做图片分类和 ResNet Efficientnet 等常用分类网络的对比
文章大纲 yolo v8 图片分类 简介与原理说明 训练代码 数据集的组织 多尺度训练 参考内容 ResNet 简介与原理说明 训练代码与使用说明 Usage EfficientNet 推理代码 其他 ...
- PyTorch:生态简介
PyTorch生态简介 PyTorch的强大并不仅局限于自身的易用性,更在于开源社区围绕PyTorch所产生的一系列工具包(一般是Python package)和程序,这些优秀的工具包极大地方便了Py ...
- TensorFlow2微调EfficientNet
文章目录 简介 安装 数据可视化 浏览数据 主成分分析 训练模型并保存 加载模型并预测 使用最新 EfficientNet 权重 封装 只取部分数据集训练 不同EfficientNet模型大小 参考文 ...
- ENAS:通过参数共享实现高效的神经架构搜索《EfficientNet Neural Architecture Search via Parameter Sharing》
本文总结多篇相关博客:https://www.sohu.com/a/222705024_129720.https://zhuanlan.zhihu.com/p/60592822.https://blo ...
- EfficientDet(EfficientNet+BiFPN)论文超详细解读(翻译+学习笔记+代码实现)
前言 在之前我们介绍过EfficientNet(直通车:[轻量化网络系列(6)]EfficientNetV1论文超详细解读(翻译 +学习笔记+代码实现) [轻量化网络系列(7)]EfficientNe ...
- 【项目实战课】基于Pytorch的EfficientNet血红细胞分类竞赛实战
欢迎大家来到我们的项目实战课,本期内容是<基于Pytorch的EfficientNet血红细胞分类竞赛实战>.所谓项目课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题, ...
最新文章
- 国内网络环境优化qiime2安装过程-QIIME 2安装慢或无法下载的解决方案
- SAP MM 存储条件 - Room Temperature Vs Ambient
- LeetCode-数学-9. 回文数
- java并发之SynchronousQueue实现原理
- 我的Ubuntu9.10安装与配置
- 没有一部是烂片 香港最强水准的10部影片
- 实际案例演示:一行 Python 代码实现并行
- 使用Nexus2.x为Maven3.x搭建私服构件仓库
- mysql索引篇之覆盖索引、联合索引、索引下推
- CentOS7 安装 Jenkins( 构建 Vue 和 dotNET Core )
- 数组名和取数组名的区别
- Chrome用户不喜新版:宁用其他浏览器也不要用旧版本
- 程序员,该注意下啦!
- 反向题在测试问卷信效度_运动员积极心理品质结构模型与问卷信效度
- ps裁剪和裁切的区别_PS剪切、裁剪、裁切的区别
- mysql查询出的数据转换为数字,关于sql:在MySQL查询中将文本转换为数字
- 自旋锁(spin lock)学习
- RPG Maker MV之起始队伍设置
- stm32之中断系统
- 组件化 得到 DDComponent JIMU 模块 插件 MD