EfficientNet:复合缩放方法与高效卷积网络
EfficientNet:复合缩放方法与高效卷积网络
在深度学习视觉任务中,模型缩放一直是提升精度的核心手段。传统做法通常只放大单一维度——深度、宽度或输入分辨率,但孤立地增加某一维度很快会遭遇收益递减。EfficientNet 系列通过复合缩放思想,在一组固定基线网络的基础上同步协调三个维度的扩张,以更少的参数和计算量达到当时最先进的准确率。本教程将从零开始讲解 EfficientNet 的设计动机、核心组件与工程实现要点。
为什么需要复合缩放
更大的模型通常表达能力更强,但如何“变大”是有讲究的:
- 增加深度会带来更强的特征层次,但梯度消失、训练困难,且极度加深后精度饱和。
- 增加宽度可以让每层捕获更丰富的特征,但宽而浅的网络难以学习高层抽象。
- 增大图像分辨率可以保留细节,但分辨率过高后计算量暴增,而准确率收益不明显。
这三者不是孤立的。例如,输入分辨率更高时,需要更深的网络来增大感受野,并需要更宽的层来捕获更多细粒度模式。复合缩放的核心思想是用一个统一的系数同时缩放深度、宽度和分辨率,让模型在计算预算内获得最佳平衡。
EfficientNet 的基线网络 EfficientNet-B0 是通过神经架构搜索(NAS)得到的一个精确高效的骨干;以此为起点,作者通过网格搜索确定了一个固定的缩放系数集合,然后通过一个全局的复合系数 φ 来调节模型大小,生成 B1 到 B7 的一系列模型。
复合缩放公式
对于给定的复合系数 φ,缩放遵循如下规则:
- 深度:( d = \alpha^\phi )
- 宽度:( w = \beta^\phi )
- 分辨率:( r = \gamma^\phi )
其中 α, β, γ 是在基线网络上通过小范围网格搜索确定的常数,满足约束 (\alpha \cdot \beta^2 \cdot \gamma^2 \approx 2),这样当 φ 增加 1 时,FLOPS 大约增加为原来的 2 倍。搜索得到的最优值约为 α = 1.2, β = 1.1, γ = 1.15。然后对于不同的 φ,按照公式计算深度、宽度和分辨率,并向上取整到合适的通道数和层数,即得到不同规模的 EfficientNet。
这个设计的精妙之处在于:不需要对每个规模重新进行架构搜索,仅需缩放系数组就能自动化生成一族高效模型,大幅节省设计成本。
基线网络 EfficientNet-B0 的结构
EfficientNet-B0 由一系列移动翻转瓶颈卷积块(MBConv)堆叠而成,并加入了 Squeeze-and-Excitation(SE)优化。整体结构分为 9 个阶段,核心积木块如下:
MBConv 块(Mobile Inverted Bottleneck Convolution)
一个典型的 MBConv 块包含以下层:
- 1×1 逐点卷积(升维):将输入通道数扩展为原来的若干倍(扩展比通常为 1 或 6)。
- Depthwise 卷积:在空间维度上用 k×k 的 depthwise 卷积(通常 k=3 或 5)提取特征。
- SE 模块:全局平均池化后用两个全连接层计算出通道权重,再与特征相乘,增强重要通道。
- 1×1 逐点卷积(降维):将通道数投影回原始或期望的输出通道数。
如果输入和输出维度相同且步长为 1,还会添加残差连接(跳跃连接)。整个块的设计思路与 MobileNetV2 的倒残差结构相似,但加入了 SE 注意力机制,使网络能以极低成本提升表征能力。
B0 具体配置:每个阶段的层数、通道数、扩展比、卷积核大小、步长均被仔细调整,最终在 ImageNet 上仅用 5.3M 参数量即达到了 76.3% 的 top-1 准确率。
从 B0 到 B7:模型族生成
按照复合缩放公式,令 φ 依次取 0,1,2,...,7,可得到 EfficientNet-B0 到 B7。随着 φ 增加:
- 深度、宽度、分辨率同步提升。
- 计算量 (FLOPS) 基本保持每级翻倍。
- B7 以 66M 参数量达到 84.4% 的 ImageNet top-1 精度,远超之前更重型的网络(如 ResNet-152 的 77.8%,GPipe 等)。
这种平滑的模型族非常便于工程落地:开发者可根据实际延迟、吞吐或内存限制,直接选择对应级别的模型,无需重新设计。
与其它缩放策略的直观对比
| 缩放方法 | 特点 | 代表模型 | 缺陷 |
|---|---|---|---|
| 仅加深 | 增加层数 | ResNet-200 | 梯度消失,精度容易饱和 |
| 仅加宽 | 增加通道数 | Wide ResNet | 细粒度模式捕获能力提升有限 |
| 仅提高分辨率 | 增大输入尺寸 | 各种高分辨率输入 | 感受野跟不上,计算量浪费 |
| 复合缩放 | 三者协调增加 | EfficientNet | 需事先通过小网格搜索确定系数,但模型族一致性好 |
从实验看,在相同计算量下,复合缩放的准确率持续高于单一维度缩放,尤其是在移动端或云端有限算力场景下,优势更为显著。
核心代码实现思路
在实际项目中,我们可以使用 PyTorch 或 TensorFlow 实现 EfficientNet。下面以 PyTorch 风格展示主要组件的伪代码,帮助初学者理解结构。
MBConv 块实现框架:
class MBConvBlock(nn.Module):
def __init__(self, in_ch, out_ch, expand_ratio, kernel_size, stride, se_ratio=0.25):
super().__init__()
mid_ch = in_ch * expand_ratio
self.use_residual = (stride == 1 and in_ch == out_ch)
# 扩展卷积
self.expand_conv = nn.Conv2d(in_ch, mid_ch, 1, bias=False) if expand_ratio != 1 else nn.Identity()
self.bn0 = nn.BatchNorm2d(mid_ch)
# 深度可分离卷积
self.depthwise_conv = nn.Conv2d(mid_ch, mid_ch, kernel_size, stride, padding=kernel_size//2, groups=mid_ch, bias=False)
self.bn1 = nn.BatchNorm2d(mid_ch)
# SE 模块
self.se = SEModule(mid_ch, se_ratio)
# 投影卷积
self.project_conv = nn.Conv2d(mid_ch, out_ch, 1, bias=False)
self.bn2 = nn.BatchNorm2d(out_ch)
def forward(self, x):
out = F.relu(self.bn0(self.expand_conv(x)))
out = F.relu(self.bn1(self.depthwise_conv(out)))
out = self.se(out)
out = self.bn2(self.project_conv(out))
if self.use_residual:
out = out + x
return out
SE 模块非常简单:全局平均池化 → FC 降维 → ReLU → FC 升维 → Sigmoid,然后与原始特征相乘。
完整的 EfficientNet 则是将多个阶段按配置堆叠,首层为普通 3×3 卷积,最后经过全局平均池化和分类器。网络定义可以根据 α, β, γ 和 φ 自动生成对应深宽度和输入尺寸,实现模型族一键构建。
训练与使用技巧
- 输入尺寸:EfficientNet 各个版本有建议输入,如 B0 为 224,B3 为 300,B7 为 600。实际训练时可用较小的初始尺寸进行迁移学习,后期逐步提升。
- Dropout 与 DropConnect:EfficientNet 中使用了 DropConnect(随机丢弃全连接层权重),正则化较强,需要根据模型大小调整丢弃概率,一般 B0 为 0.2,B7 为 0.5。
- 优化器与学习率:常用 RMSProp 或 AdamW,搭配余弦退火学习率调度。大批次训练时需配合线性缩放规则。
- 迁移学习:在小型数据集上使用 EfficientNet,可冻结底层(前几阶段)仅训练分类头或微调最后几个 MBConv 块,保留预训练权重,收敛快且不易过拟合。
- 推理优化:由于网络主要由深度可分离卷积构成,在移动端或边缘设备上可以通过量化、裁剪、TensorRT 等工具进一步加速,保留高准确率的同时实现毫秒级延迟。
EfficientNet 在当代的应用场景
- 图像分类:作为标准骨干网络,替换 ResNet 或 MobileNet,在许多比赛中仍被广泛使用。
- 目标检测:作为 EfficientDet 的骨干,与加权双向特征金字塔网络(BiFPN)结合,实现高效检测。
- 语义分割:许多轻量分割网络(如 EfficientNet + DeepLabV3+ 变体)在移动端场景下表现突出。
- 图像检索、风格迁移等:利用其高质量的中间层特征,可作为通用视觉编码器。
由于结构规范、模型族延展性强,EfficientNet 已成为工业界和学术界的标准组件。其复合缩放思想也启发了后续在 NLP、多模态等领域的模型缩放策略。
总结
EfficientNet 证明了平衡缩放深度、宽度和分辨率是提升卷积网络效率的关键。通过基线架构 NAS 搜索与固定复合系数的自动化缩放,EfficientNet 在参数效率上设立了新的标杆。掌握其原理与实现,不仅有助于理解现代卷积网络的设计哲学,也能在实际项目中快速选型、迁移和部署高性能视觉模型。