EfficientNet
简介
paper:EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
conference:2019 ICML
团队:Google Research, Brain Team
代码:官方源码
研究内容:网络的拓扑结构和尺寸大小设计是决定性能的关键点,本文给出一种方案,先用NAS搜索出一个较小的表现好的拓扑结构,再给出一个缩放的办法,使放大后的网络模型也能获得较好的效果。
之前的工作:ResNet系列,GPipe,NASNet,MnasNet,MBConv
之后的工作:EfficientDet (同作者), ResNeSt, RegNet
贡献点
- depth (network length), width (channel), resolution (H*W, 一般H和W是相等的) 均匀缩放效果最好。
- ImageNet精度最高,且更小(8倍)更快(6倍)
内容细节
- 初始网络efficient-b0是用神经架构搜索NAS搜出来的。
- 优化目标:准确率和FLOPS, A C C ( m ) ∗ [ F L O P S ( m ) / T ] w ACC(m)*[FLOPS(m)/T]^w ACC(m)∗[FLOPS(m)/T]w,T是target FLOPS, w = − 0.07 w=-0.07 w=−0.07是一个tradeoff
- 这个结构跟MnasNet很像,主要的block是MBConv
- 缩放策略:同时均匀放大width,channel,resolution
- 思想
1)depth:更深的网络能捕捉到更丰富、更复杂的特征,而且在新任务上泛化性能比较好;但难训练。
2)width:channel多的话能捕捉到更细粒度(fine-grained)的特征,容易训练;但可能捕捉不到high-level特征。
3)resolution:分辨率会直接影响到精度。GPipe用了 480 ∗ 480 480*480 480∗480,目标检测里甚至有 600 ∗ 600 600*600 600∗600。 - 具体公式:
α
,
β
,
γ
\alpha, \beta, \gamma
α,β,γ是在
[
0
,
1
]
[0, 1]
[0,1]之间grid search得到的固定值,文中约束了
(
α
∗
β
2
∗
γ
2
)
ϕ
≈
2
(\alpha * \beta^2 * \gamma^2)^\phi \approx 2
(α∗β2∗γ2)ϕ≈2,这样总体的FLOPS大约增加
2
ϕ
2^\phi
2ϕ,可以根据自己拥有的资源大小设置
ϕ
\phi
ϕ.
ϕ = 1 \phi=1 ϕ=1时,网格法搜出来efficientnet-b0的最佳参数是 α = 1.2 , β = 1.1 , γ = 1.15 \alpha=1.2, \beta=1.1, \gamma=1.15 α=1.2,β=1.1,γ=1.15.
- 训练细节:
RMSProp optimizer with decay 0.9 and momentum 0.9; batch norm momentum 0.99; weight decay 1e-5;
initial learning rate 0.256 that decays by 0.97 every 2.4 epochs.
dropout #网络越大越要加强正则,b0-0.2, b7-0.5
- 训练trick:
1)2.4 epoch是因为对应ImageNet约三百万张图
2)swish激活
3)fixed AutoAugment策略(CVPR19)(据说去掉这个trick b0的准确率会跌到74%以下)
4)随机深度stochastic depth,存活概率0.8(ECCV16)
实验结果
- ImageNet分类结果
- 效率比较
- transfer learning数据集:pre-train + fine tune
其他
1、b1-b7的相关参数
params_dict = {
# (width_coefficient, depth_coefficient, resolution, dropout_rate)
'efficientnet-b0': (1.0, 1.0, 224, 0.2), # 跟论文不太一致
'efficientnet-b1': (1.0, 1.1, 240, 0.2),
'efficientnet-b2': (1.1, 1.2, 260, 0.3),
'efficientnet-b3': (1.2, 1.4, 300, 0.3),
'efficientnet-b4': (1.4, 1.8, 380, 0.4),
'efficientnet-b5': (1.6, 2.2, 456, 0.4),
'efficientnet-b6': (1.8, 2.6, 528, 0.5),
'efficientnet-b7': (2.0, 3.1, 600, 0.5),
}
2、GitHub上有pytorch实现,并提供了相应模型,可以直接使用。code
3、后续提出了EfficientDet做目标检测(EfficientDet: Scalable and Efficient Object Detection,code)
应用
1、直接把ImageNet训练好的模型拿来,对没有标签的数据提特征。
2、如果自己要做的任务有标签数据,可以fine tune做transfer learning。
3、模型选择: 可以b0先试一下,然后估算资源限制,选择能承受的
ϕ
\phi
ϕ,直接用预训练的模型,或者从b0增长一个模型自己训练。
4、自己训练efficientnet时候注意参考作者的参数。
5、训练别的模型可能这套参数也可以试一下?