EfficientNet:复合缩放
源码、配套笔记&讲解视频,点击文末名片获取
- 研究背景和动机
在深度学习的发展过程中,我们面临了一个很典型的矛盾:
👉 模型越大,准确率越高,但计算代价也越大。
- ResNet、Inception 这种模型往往需要巨大的算力和显存,普通电脑甚至很难训练。
- MobileNet、ShuffleNet 虽然轻量化,但精度相对受限。
于是,研究人员一直在思考:
能不能在保持高精度的同时,也让模型在计算和参数规模上尽量小?
传统的扩展方式
在以往,如果我们想提升一个卷积神经网络的性能,通常有三种办法:
- 加深(Depth):让网络更“高层次”,提取更复杂的特征。
- 类比:工厂生产线上增加更多工序。
- 加宽(Width):让每一层有更多通道,能捕捉到更多特征。
- 类比:每道工序安排更多工人。
- 加大输入分辨率(Resolution):让模型处理更清晰的图像。
- 类比:工厂收到更高质量的原材料。
但是,如果只靠人工经验去调这三种扩展方式,往往会出现问题: - 光加深 → 太复杂,训练难,容易过拟合。
- 光加宽 → 参数暴涨,运行慢。
- 光提分辨率 → 显存爆炸,效率极低。
这就像工厂只顾着在一个方向扩张,结果要么效率低下,要么浪费资源。
EfficientNet 的动机
谷歌团队提出 EfficientNet,就是要解决这个矛盾:
- 不再“凭感觉”去调深度、宽度、分辨率。
- 而是设计了一种 复合缩放策略(Compound Scaling),让三者协同增长,达到 更高效的平衡。
类比:
这就像工厂扩建时,不是只增加工序(深度)或工人(宽度),也不是只换更好的原料(分辨率),
而是 在三方面按比例一起扩张,让整个生产线保持最高效率。
📌 总结一句话:
EfficientNet 的动机就是要找到一个 精度和效率的最佳平衡点 —— 用最少的计算,换取尽可能高的性能。
- EfficientNet 的创新点
(1)复合缩放(Compound Scaling)策略
传统的网络扩展有三个方向:
以前的做法:只加深、只加宽、或只提分辨率。
- 缺点:效率低,计算浪费。
EfficientNet 的新思路:
👉 三者一起按比例增长,用一个固定的“放大系数”去同时控制深度、宽度和分辨率。
📌 类比:
想象一家工厂要扩张: - 如果只加长流水线(深度),工人会过于劳累,效率下降。
- 如果只加工人(宽度),工序跟不上,很多工人闲着。
- 如果只换更高品质的原料(分辨率),产线太慢。
复合缩放 = 三方面一起扩展,比如: - 工厂多加几道工序(深度)
- 每道工序多配一些工人(宽度)
- 同时原料品质也提升(分辨率)
这样扩张才是“均衡”的,效率最高。
(2)高效基准网络 EfficientNet-B0
复合缩放要有一个“起点”,否则你不知道该往哪个方向扩。
谷歌团队先用 神经结构搜索(NAS) 找到了一个基础网络(EfficientNet-B0)。
这个基准模型已经很高效:
- 用了 MobileNetV2 的 倒残差块(Inverted Residual Block) + 深度可分离卷积,
- 在轻量化和准确率之间找到最佳平衡。
然后再在这个 B0 的基础上,通过 复合缩放公式,得到一系列模型(B1-B7): - B0 → 最小巧,适合移动端。
- B7 → 最大,准确率最强,适合服务器。
(3)极致的性能-效率平衡
在 ImageNet 上,EfficientNet-B7 仅用 1/8 的计算量,就超过了 ResNet-152 的准确率。
👉 这意味着:
- 不再需要盲目增加算力,
- 而是通过科学的扩展方式,实现 精度和速度双赢。
- EfficientNet 的网络结构
EfficientNet 的整体结构是:
👉 在 MobileNetV2 的 倒残差模块(Inverted Residual Block) 基础上,加上 SE 注意力机制,然后通过复合缩放扩展得到不同规模的网络(B0-B7)。
(1)整体结构流程
EfficientNet-B0 的结构大致分为:
- Stem(输入层)
- 一个 3×3 卷积,stride=2
- 把输入图像缩小,同时提取初步特征。
- 类比:工厂的“安检门”,先把原材料(图片)统一标准化。
- 多个阶段(Stage 1 - Stage 7)
- 每个阶段由一堆 MBConv 模块(Mobile Inverted Bottleneck Convolution,来自 MobileNetV2)堆叠而成。
- 在中间加入 SE 模块(Squeeze-and-Excitation),让模型学会“哪些通道更重要”。
- 分辨率逐渐减小(图像被压缩),通道数逐渐增大(特征越来越多)。
- 类比:流水线上的工序,一步步加工,把原料从“粗胚”打磨成“精细产品”。
- Head(输出层)
- 一个 1×1 卷积 → 压缩整合特征
- 全局平均池化(Global Average Pooling)
- 全连接层(FC)输出分类结果
- 类比:最后的“质检 + 打包 + 出厂”。
(2)核心模块:MBConv(倒残差 + 深度可分离卷积 + SE)
EfficientNet 的主体是堆叠的 MBConv 模块。
一个 MBConv 长这样:
- 扩展卷积 (1×1 Conv)
- 把输入的低维特征扩展到高维。
- 类比:先把原料铺开成更多种类,方便后续挑选和加工。
- Depthwise 卷积 (3×3 DWConv)
- 对每个通道单独做卷积 → 轻量化。
- 类比:每条生产线独立加工自己的零件。
- SE 注意力模块
- 给通道加权重,让重要的特征更突出。
- 类比:在工厂中请“质检员”,专门标记哪些零件最关键。
- 压缩卷积 (1×1 Conv)
- 再把高维特征压缩回低维。
- 类比:把加工好的零件重新打包,节省空间。
- 残差连接
- 如果输入输出大小一样,就加上“捷径连接”,避免信息丢失。
- 类比:万一流水线加工出错,还有一条“原料直通线”兜底。
(3)EfficientNet-B0 的典型配置
- Stage 1:MBConv1(轻量版本)
- Stage 2-7:MBConv6(扩展倍率=6,更强大)
- 每个 Stage 有不同的重复次数(重复堆叠模块),分辨率逐渐降低,通道数逐渐增加。
📌 直观理解: - 前期(浅层):分辨率大,但通道少 → 捕捉低级特征(边缘、纹理)。
- 中期:分辨率降低,通道增加 → 捕捉中级特征(局部结构)。
- 后期(深层):分辨率更小,通道更多 → 捕捉高级语义(整体形状、类别)。
(4)复合缩放(B0 → B7)
- B0:基准小工厂(轻量、快速)
- B1-B7:逐渐扩展深度、宽度、分辨率 → 更强大的工厂
- 不同规模,适配不同设备(手机、服务器、云端)。
✅ 总结
EfficientNet 的网络结构可以概括为:
- 基于 MobileNetV2 的 MBConv 模块(扩展卷积 + DWConv + 压缩卷积)
- 加入 SE 注意力,让特征选择更聪明
- 通过 复合缩放策略,形成不同规模的模型(B0-B7)
- 实现了 轻量化 + 高精度 的最佳平衡。
4、 致命缺陷:
虽然 EfficientNet 很“高效”,但是它也有一些 最核心、最致命的缺陷:
(1)对分辨率变化不鲁棒
- EfficientNet 依赖 复合缩放(depth + width + resolution),这在 ImageNet 等大数据集上效果很好。
- 但是当输入分辨率发生变化(比如真实场景里图片更大/更小),模型性能容易下降。
- 类比:工厂的流水线是为某种规格的原料(比如标准零件大小)设计好的,如果换了一种规格,机器就卡壳了。
(2)迁移到小数据集时效果不佳
- EfficientNet 的搜索和缩放主要基于大规模数据集(ImageNet)。
- 当换到小数据集(比如医学图像、细分领域)时,容易 过拟合 或者 泛化能力不足。
- 类比:工厂是为大批量生产设计的,如果只生产少量零件,反而不经济,甚至会出次品。
✅ 最致命的缺陷(总结)
EfficientNet 的最大问题是:
👉 对不同任务和硬件的泛化性差,实际部署时性能往往达不到理论值。
5、 后续改进方向
- EfficientNetV2(2021)
- 改进点:
- 发现 EfficientNet 在小分辨率下训练很慢,于是引入了 Fused-MBConv(把 1×1 卷积和 3×3 卷积分开,减少小操作带来的硬件瓶颈)。
- 加入 渐进式学习策略:训练时先用低分辨率,再逐渐提高分辨率,提升训练速度。
- 效果:训练更快、推理更快,在真实硬件上更友好。
- 类比:原来的工厂工序太细,工人们经常要“等”,V2 就把一些工序合并成大步骤,同时生产时先用小样品练手,再上大货。
- RegNet(Facebook, 2020)
- 改进点:
- 不再用“复合缩放”这种固定比例,而是通过研究大量模型发现,逐层通道数增长规律才是关键。
- 提出了简单的设计规则,结构更规则、更适合硬件。
- 效果:比 EfficientNet 更稳定、灵活。
- 类比:工厂扩建不再死板按比例,而是根据“经验公式”来规划每个车间该有多少工人,结果更高效。
- ConvNeXt(Meta, 2022)
- 改进点:
- 借鉴 Transformer 的设计思路,对传统卷积结构做现代化改造(比如更大的卷积核、LayerNorm 代替 BN、简化模块)。
- 证明 纯卷积网络在大数据集上仍然能和 Transformer 一样强,而且更高效。
- 效果:既有 EfficientNet 的高效性,又比它更灵活,更适合大规模训练。
- 类比:工厂原来一直在“微调机器”,ConvNeXt 直接来了一次“大装修”,换了新机器,结果产能和效率都更好。