Skip to main content

PyTorch 的(通用)EfficientNets

项目描述

PyTorch 的(通用)EfficientNets

EfficientNet、MixNet、MobileNetV3 等的“通用”实现,涵盖了从 MobileNet V1/V2 块序列派生的大多数计算/参数高效架构,包括通过自动神经架构搜索找到的架构。

所有模型均由 GenEfficientNet 或 MobileNetV3 类实现,具有基于字符串的体系结构定义来配置块布局(来自此处的想法)

什么是新的

2020 年 8 月 19 日

  • 添加更新的 PyTorch 训练的 EfficientNet-B3 权重,由我自己训练timm(82.1 top-1)
  • 添加由@hal-314贡献的 PyTorch 训练的 EfficientNet-Lite0 (75.5 top-1)
  • 更新 ONNX 和 Caffe2 导出/实用程序脚本以使用最新的 PyTorch/ONNX
  • 添加了基于 ONNX 运行时的验证脚本
  • timm激活(大部分)与等效项同步

2020 年 4 月 5 日

  • 添加一些新训练的 MobileNet-V2 模型,这些模型使用最新的 h 参数、rand augment 进行训练。它们与 EfficientNet-Lite 相比相当有利
    • 3.5M 参数 MobileNet-V2 100 @ 73%
    • 4.5M 参数 MobileNet-V2 110d @ 75%
    • 6.1M 参数 MobileNet-V2 140 @ 76.5%
    • 5.8M 参数 MobileNet-V2 120d @ 77.3%

2020 年 3 月 23 日

  • 添加具有从Tensorflow TPU移植的权重的 EfficientNet-Lite 模型
  • 添加 PyTorch 训练的 MobileNet-V3 具有 75.77% top-1 的大权重
  • 重要更改(如果从头开始训练)- 更改权重 init 以更好地匹配 Tensorflow impl,设置fix_group_fanout=Falseinitialize_weight_goog旧行为

2020 年 2 月 12 日

  • 添加从Tensorflow TPU移植的 EfficientNet-L2 和 B0-B7 NoisyStudent 权重
  • 从 TF TPU 移植新的 EfficientNet-B8 (RandAugment) 权重,这些不同于 B8 AdvProp,不同的输入归一化。
  • 添加 RandAugment PyTorch 训练的 EfficientNet-ES (EdgeTPU-Small) 权重,权重为 78.1 top-1。由安德鲁·拉文训练

2020 年 1 月 22 日

  • 使用最新的 RandAugment 训练权重更新 EfficientNet B0、B2、B3 和 MixNet-XL 的权重。受过训练(https://github.com/rwightman/pytorch-image-models
  • 修复 PyTorch 1.4 的 torchscript 兼容性,使用 ModuleDict 添加对 MixedConv2d 的 torchscript 支持
  • 使用 PyTorch 1.4 测试模型、torchscript、onnx 导出——没问题

2019 年 11 月 22 日

  • 新的前1高!移植官方 TF EfficientNet AdvProp ( https://arxiv.org/abs/1911.09665 ) 权重和 B8 模型规范。创建了一组新ap模型,因为它们使用与原始 EfficientNet 基础/AA/RA 权重不同的预处理(初始均值/标准差)。

2019 年 11 月 15 日

  • 移植官方 TF MobileNet-V3 float32 large/small/minimalistic weights
  • 修改 MobileNet-V3 模型和组件以支持 TF MobileNet-V3 和我的差异所需的一些额外配置

2019 年 10 月 30 日

  • 许多模型现在可以使用 torch.jit.script,MixNet 是最大的例外
  • 改进了启用 torchscript 或 ONNX 导出兼容模式的界面(通过配置)
  • 除了内存高效的 autgrad.fn 之外,还添加了 JIT 优化的内存高效 Swish/Mish autograd.fn
  • 激活工厂按名称选择最佳激活版本或全局覆盖一个
  • 添加处理输入转换和分类器更改的预训练检查点加载助手

2019 年 10 月 27 日

楷模

实施的模型包括:

我最初在这里用代码实现和训练了一些模型,这个存储库只包含 GenEfficientNet 模型、验证和相关的 ONNX/Caffe2 导出代码。

预训练

我已经设法训练了几个模型,使其精度接近或高于原始论文和官方 impl。我的训练代码在这里:https ://github.com/rwightman/pytorch-image-models

模型 Prec@1 (错误) Prec@5 (错误) 参数#(M) MAdds(M) 图像缩放 解析度 庄稼
高效网络_b3 82.240 (17.760) 96.116 (3.884) 12.23 待定 双三次 320 1.0
高效网络_b3 82.076 (17.924) 96.020 (3.980) 12.23 待定 双三次 300 0.904
mixnet_xl 81.074 (18.926) 95.282 (4.718) 11.90 待定 双三次 256 1.0
高效网络_b2 80.612 (19.388) 95.318 (4.682) 9.1 待定 双三次 288 1.0
mixnet_xl 80.476 (19.524) 94.936 (5.064) 11.90 待定 双三次 224 0.875
高效网络_b2 80.288 (19.712) 95.166 (4.834) 9.1 1003 双三次 260 0.890
mixnet_l 78.976 (21.024 94.184 (5.816) 7.33 待定 双三次 224 0.875
高效网络_b1 78.692 (21.308) 94.086 (5.914) 7.8 694 双三次 240 0.882
高效网络 78.066 (21.934) 93.926 (6.074) 5.44 待定 双三次 224 0.875
高效网络_b0 77.698 (22.302) 93.532 (6.468) 5.3 390 双三次 224 0.875
mobilenetv2_120d 77.294 (22.706 93.502 (6.498) 5.8 待定 双三次 224 0.875
mixnet_m 77.256 (22.744) 93.418 (6.582) 5.01 353 双三次 224 0.875
mobilenetv2_140 76.524 (23.476) 92.990 (7.010) 6.1 待定 双三次 224 0.875
mixnet_s 75.988 (24.012) 92.794 (7.206) 4.13 待定 双三次 224 0.875
mobilenetv3_large_100 75.766 (24.234) 92.542 (7.458) 5.5 待定 双三次 224 0.875
mobilenetv3_rw 75.634 (24.366) 92.708 (7.292) 5.5 219 双三次 224 0.875
高效网络精简版0 75.472 (24.528) 92.520 (7.480) 4.65 待定 双三次 224 0.875
mnasnet_a1 75.448 (24.552) 92.604 (7.396) 3.9 312 双三次 224 0.875
fbnetc_100 75.124 (24.876) 92.386 (7.614) 5.6 385 双线性 224 0.875
mobilenetv2_110d 75.052 (24.948) 92.180 (7.820) 4.5 待定 双三次 224 0.875
mnasnet_b1 74.658 (25.342) 92.114 (7.886) 4.4 315 双三次 224 0.875
spnasnet_100 74.084 (25.916) 91.818 (8.182) 4.4 待定 双线性 224 0.875
mobilenetv2_100 72.978 (27.022) 91.016 (8.984) 3.5 待定 双三次 224 0.875

更多预训练模型即将推出...

移植重量

一旦添加了相同的卷积填充等效项,并且通过 cmd 行 args 使用相同的裁剪因子、图像缩放等(见表),从 EfficientNet 模型的 Tensorflow 检查点移植的权重在 Tensorflow 中的准确度几乎匹配。

重要的:

  • 用于 EfficientNet AdvProp (AP)、EfficientNet EdgeTPU、EfficientNet-CondConv、EfficientNet-Lite 和 MobileNet-V3 模型的 Tensorflow 移植权重使用 Inception 样式 (0.5, 0.5, 0.5) 表示均值和标准差。
  • 在验证时启用 Tensorflow 预处理管道--tf-preprocessing将提高 0.1-0.5% 的分数,非常接近原始 TF impl。

要对 tf_efficientnet_b5 运行验证: python validate.py /path/to/imagenet/validation/ --model tf_efficientnet_b5 -b 64 --img-size 456 --crop-pct 0.934 --interpolation bicubic

要为 tf_efficientnet_b5 运行带 TF 预处理的验证: python validate.py /path/to/imagenet/validation/ --model tf_efficientnet_b5 -b 64 --img-size 456 --tf-preprocessing

使用 Inception 预处理对模型运行验证,即 EfficientNet-B8 AdvProp: python validate.py /path/to/imagenet/validation/ --model tf_efficientnet_b8_ap -b 48 --num-gpu 2 --img-size 672 --crop-pct 0.954 --mean 0.5 --std 0.5

模型 Prec@1 (错误) Prec@5 (错误) 参数# 图像缩放 图片尺寸 庄稼
tf_efficientnet_l2_ns *tfp 88.352 (11.648) 98.652 (1.348) 480 双三次 800 不适用
tf_efficientnet_l2_ns 待定 待定 480 双三次 800 0.961
tf_efficientnet_l2_ns_475 88.234 (11.766) 98.546 (1.454) 480 双三次 475 0.936
tf_efficientnet_l2_ns_475 *tfp 88.172 (11.828) 98.566 (1.434) 480 双三次 475 不适用
tf_efficientnet_b7_ns *tfp 86.844 (13.156) 98.084 (1.916) 66.35 双三次 600 不适用
tf_efficientnet_b7_ns 86.840 (13.160) 98.094 (1.906) 66.35 双三次 600 不适用
tf_efficientnet_b6_ns 86.452 (13.548) 97.882 (2.118) 43.04 双三次 528 不适用
tf_efficientnet_b6_ns *tfp 86.444 (13.556) 97.880 (2.120) 43.04 双三次 528 不适用
tf_efficientnet_b5_ns *tfp 86.064 (13.936) 97.746 (2.254) 30.39 双三次 456 不适用
tf_efficientnet_b5_ns 86.088 (13.912) 97.752 (2.248) 30.39 双三次 456 不适用
tf_efficientnet_b8_ap *tfp 85.436 (14.564) 97.272 (2.728) 87.4 双三次 672 不适用
tf_efficientnet_b8 *tfp 85.384 (14.616) 97.394 (2.606) 87.4 双三次 672 不适用
tf_efficientnet_b8 85.370 (14.630) 97.390 (2.610) 87.4 双三次 672 0.954
tf_efficientnet_b8_ap 85.368 (14.632) 97.294 (2.706) 87.4 双三次 672 0.954
tf_efficientnet_b4_ns *tfp 85.298 (14.702) 97.504 (2.496) 19.34 双三次 380 不适用
tf_efficientnet_b4_ns 85.162 (14.838) 97.470 (2.530) 19.34 双三次 380 0.922
tf_efficientnet_b7_ap *tfp 85.154 (14.846) 97.244 (2.756) 66.35 双三次 600 不适用
tf_efficientnet_b7_ap 85.118 (14.882) 97.252 (2.748) 66.35 双三次 600 0.949
tf_efficientnet_b7 *tfp 84.940 (15.060) 97.214 (2.786) 66.35 双三次 600 不适用
tf_efficientnet_b7 84.932 (15.068) 97.208 (2.792) 66.35 双三次 600 0.949
tf_efficientnet_b6_ap 84.786 (15.214) 97.138 (2.862) 43.04 双三次 528 0.942
tf_efficientnet_b6_ap *tfp 84.760 (15.240) 97.124 (2.876) 43.04 双三次 528 不适用
tf_efficientnet_b5_ap *tfp 84.276 (15.724) 96.932 (3.068) 30.39 双三次 456 不适用
tf_efficientnet_b5_ap 84.254 (15.746) 96.976 (3.024) 30.39 双三次 456 0.934
tf_efficientnet_b6 *tfp 84.140 (15.860) 96.852 (3.148) 43.04 双三次 528 不适用
tf_efficientnet_b6 84.110 (15.890) 96.886 (3.114) 43.04 双三次 528 0.942
tf_efficientnet_b3_ns *tfp 84.054 (15.946) 96.918 (3.082) 12.23 双三次 300 不适用
tf_efficientnet_b3_ns 84.048 (15.952) 96.910 (3.090) 12.23 双三次 300 .904
tf_efficientnet_b5 *tfp 83.822 (16.178) 96.756 (3.244) 30.39 双三次 456 不适用
tf_efficientnet_b5 83.812 (16.188) 96.748 (3.252) 30.39 双三次 456 0.934
tf_efficientnet_b4_ap *tfp 83.278 (16.722) 96.376 (3.624) 19.34 双三次 380 不适用
tf_efficientnet_b4_ap 83.248 (16.752) 96.388 (3.612) 19.34 双三次 380 0.922
tf_efficientnet_b4 83.022 (16.978) 96.300 (3.700) 19.34 双三次 380 0.922
tf_efficientnet_b4 *tfp 82.948 (17.052) 96.308 (3.692) 19.34 双三次 380 不适用
tf_efficientnet_b2_ns *tfp 82.436 (17.564) 96.268 (3.732) 9.11 双三次 260 不适用
tf_efficientnet_b2_ns 82.380 (17.620) 96.248 (3.752) 9.11 双三次 260 0.89
tf_efficientnet_b3_ap *tfp 81.882 (18.118) 95.662 (4.338) 12.23 双三次 300 不适用
tf_efficientnet_b3_ap 81.828 (18.172) 95.624 (4.376) 12.23 双三次 300 0.904
tf_efficientnet_b3 81.636 (18.364) 95.718 (4.282) 12.23 双三次 300 0.904
tf_efficientnet_b3 *tfp 81.576 (18.424) 95.662 (4.338) 12.23 双三次 300 不适用
tf_efficientnet_lite4 81.528 (18.472) 95.668 (4.332) 13.00 双线性 380 0.92
tf_efficientnet_b1_ns *tfp 81.514 (18.486) 95.776 (4.224) 7.79 双三次 240 不适用
tf_efficientnet_lite4 *tfp 81.502 (18.498) 95.676 (4.324) 13.00 双线性 380 不适用
tf_efficientnet_b1_ns 81.388 (18.612) 95.738 (4.262) 7.79 双三次 240 0.88
tf_efficientnet_el 80.534 (19.466) 95.190 (4.810) 10.59 双三次 300 0.904
tf_efficientnet_el *tfp 80.476 (19.524) 95.200 (4.800) 10.59 双三次 300 不适用
tf_efficientnet_b2_ap *tfp 80.420 (19.580) 95.040 (4.960) 9.11 双三次 260 不适用
tf_efficientnet_b2_ap 80.306 (19.694) 95.028 (4.972) 9.11 双三次 260 0.890
tf_efficientnet_b2 *tfp 80.188 (19.812) 94.974 (5.026) 9.11 双三次 260 不适用
tf_efficientnet_b2 80.086 (19.914) 94.908 (5.092) 9.11 双三次 260 0.890
tf_efficientnet_lite3 79.812 (20.188) 94.914 (5.086) 8.20 双线性 300 0.904
tf_efficientnet_lite3 *tfp 79.734 (20.266) 94.838 (5.162) 8.20 双线性 300 不适用
tf_efficientnet_b1_ap *tfp 79.532 (20.468) 94.378 (5.622) 7.79 双三次 240 不适用
tf_efficientnet_cc_b1_8e *tfp 79.464 (20.536) 94.492 (5.508) 39.7 双三次 240 0.88
tf_efficientnet_cc_b1_8e 79.298 (20.702) 94.364 (5.636) 39.7 双三次 240 0.88
tf_efficientnet_b1_ap 79.278 (20.722) 94.308 (5.692) 7.79 双三次 240 0.88
tf_efficientnet_b1 *tfp 79.172 (20.828) 94.450 (5.550) 7.79 双三次 240 不适用
tf_efficientnet_em *tfp 78.958 (21.042) 94.458 (5.542) 6.90 双三次 240 不适用
tf_efficientnet_b0_ns *tfp 78.806 (21.194) 94.496 (5.504) 5.29 双三次 224 不适用
tf_mixnet_l *tfp 78.846 (21.154) 94.212 (5.788) 7.33 双线性 224 不适用
tf_efficientnet_b1 78.826 (21.174) 94.198 (5.802) 7.79 双三次 240 0.88
tf_mixnet_l 78.770 (21.230) 94.004 (5.996) 7.33 双三次 224 0.875
tf_efficientnet_em 78.742 (21.258) 94.332 (5.668) 6.90 双三次 240 0.875
tf_efficientnet_b0_ns 78.658 (21.342) 94.376 (5.624) 5.29 双三次 224 0.875
tf_efficientnet_cc_b0_8e *tfp 78.314 (21.686) 93.790 (6.210) 24.0 双三次 224 0.875
tf_efficientnet_cc_b0_8e 77.908 (22.092) 93.656 (6.344) 24.0 双三次 224 0.875
tf_efficientnet_cc_b0_4e *tfp 77.746 (22.254) 93.552 (6.448) 13.3 双三次 224 0.875
tf_efficientnet_cc_b0_4e 77.304 (22.696) 93.332 (6.668) 13.3 双三次 224 0.875
tf_efficientnet_es *tfp 77.616 (22.384) 93.750 (6.250) 5.44 双三次 224 不适用
tf_efficientnet_lite2 *tfp 77.544 (22.456) 93.800 (6.200) 6.09 双线性 260 不适用
tf_efficientnet_lite2 77.460 (22.540) 93.746 (6.254) 6.09 双三次 260 0.89
tf_efficientnet_b0_ap *tfp 77.514 (22.486) 93.576 (6.424) 5.29 双三次 224 不适用
tf_efficientnet_es 77.264 (22.736) 93.600 (6.400) 5.44 双三次 224 不适用
tf_efficientnet_b0 *tfp 77.258 (22.742) 93.478 (6.522) 5.29 双三次 224 不适用
tf_efficientnet_b0_ap 77.084 (22.916) 93.254 (6.746) 5.29 双三次 224 0.875
tf_mixnet_m *tfp 77.072 (22.928) 93.368 (6.632) 5.01 双线性 224 不适用
tf_mixnet_m 76.950 (23.050) 93.156 (6.844) 5.01 双三次 224 0.875
tf_efficientnet_b0 76.848 (23.152) 93.228 (6.772) 5.29 双三次 224 0.875
tf_efficientnet_lite1 *tfp 76.764 (23.236) 93.326 (6.674) 5.42 双线性 240 不适用
tf_efficientnet_lite1 76.638 (23.362) 93.232 (6.768) 5.42 双三次 240 0.882
tf_mixnet_s *tfp 75.800 (24.200) 92.788 (7.212) 4.13 双线性 224 不适用
tf_mobilenetv3_large_100 *tfp 75.768 (24.232) 92.710 (7.290) 5.48 双线性 224 不适用
tf_mixnet_s 75.648 (24.352) 92.636 (7.364) 4.13 双三次 224 0.875
tf_mobilenetv3_large_100 75.516 (24.484) 92.600 (7.400) 5.48 双线性 224 0.875
tf_efficientnet_lite0 *tfp 75.074 (24.926) 92.314 (7.686) 4.65 双线性 224 不适用
tf_efficientnet_lite0 74.842 (25.158) 92.170 (7.830) 4.65 双三次 224 0.875
tf_mobilenetv3_large_075 *tfp 73.730 (26.270) 91.616 (8.384) 3.99 双线性 224 不适用
tf_mobilenetv3_large_075 73.442 (26.558) 91.352 (8.648) 3.99 双线性 224 0.875
tf_mobilenetv3_large_minimal_100 *tfp 72.678 (27.322) 90.860 (9.140) 3.92 双线性 224 不适用
tf_mobilenetv3_large_minimal_100 72.244 (27.756) 90.636 (9.364) 3.92 双线性 224 0.875
tf_mobilenetv3_small_100 *tfp 67.918 (32.082) 87.958 (12.042 2.54 双线性 224 不适用
tf_mobilenetv3_small_100 67.918 (32.082) 87.662 (12.338) 2.54 双线性 224 0.875
tf_mobilenetv3_small_075 *tfp 66.142 (33.858) 86.498 (13.502) 2.04 双线性 224 不适用
tf_mobilenetv3_small_075 65.718 (34.282) 86.136 (13.864) 2.04 双线性 224 0.875
tf_mobilenetv3_small_minimal_100 *tfp 63.378 (36.622) 84.802 (15.198) 2.04 双线性 224 不适用
tf_mobilenetv3_small_minimal_100 62.898 (37.102) 84.230 (15.770) 2.04 双线性 224 0.875

tf-preprocessing*通过管道验证的 tfp 模型

从官方 Tensorflow 存储库移植的 Google tf 和 tflite 权重

用法

环境

所有开发和测试都在 Linux x86-64 系统上的 Conda Python 3 环境中完成,特别是 Python 3.6.x、3.7.x、3.8.x。

用户报告说在 Windows 中安装 Python 3 Anaconda 可以正常工作。我自己还没有验证这一点。

PyTorch 版本 1.4、1.5、1.6 已使用此代码进行了测试。

我试图将依赖项保持在最低限度,设置是按照 Conda 的 PyTorch 默认安装说明进行的:

conda create -n torch-env
conda activate torch-env
conda install -c pytorch pytorch torchvision cudatoolkit=10.2

PyTorch 集线器

可以通过 PyTorch Hub API 访问模型

>>> torch.hub.list('rwightman/gen-efficientnet-pytorch')
['efficientnet_b0', ...]
>>> model = torch.hub.load('rwightman/gen-efficientnet-pytorch', 'efficientnet_b0', pretrained=True)
>>> model.eval()
>>> output = model(torch.randn(1,3,224,224))

这个包可以通过 pip 安装。

安装(在 conda env/install 之后):

pip install geffnet

评估用途:

>>> import geffnet
>>> m = geffnet.create_model('mobilenetv3_large_100', pretrained=True)
>>> m.eval()

火车用途:

>>> import geffnet
>>> # models can also be created by using the entrypoint directly
>>> m = geffnet.efficientnet_b2(pretrained=True, drop_rate=0.25, drop_connect_rate=0.2)
>>> m.train()

在 nn.Sequential 容器中创建,用于 fast.ai 等:

>>> import geffnet
>>> m = geffnet.mixnet_l(pretrained=True, drop_rate=0.25, drop_connect_rate=0.2, as_sequential=True)

出口

脚本包含在

  • 将模型导出到 ONNX ( onnx_export.py)
  • 优化的 ONNX 图(onnx_optimize.pyonnx_validate.pyw/ --onnx-output-optarg)
  • 使用 ONNX 运行时验证 ( onnx_validate.py)
  • 将 ONNX 模型转换为 Caffe2 ( onnx_to_caffe.py)
  • 在 Caffe2 ( caffe2_validate.py)中验证
  • Caffe2 中带 FLOP 的基准,参数输出 ( caffe2_benchmark.py)

例如,要导出 MobileNet-V3 预训练模型,然后运行 ​​Imagenet 验证:

python onnx_export.py --model mobilenetv3_large_100 ./mobilenetv3_100.onnx
python onnx_validate.py /imagenet/validation/ --onnx-input ./mobilenetv3_100.onnx 

这些脚本经测试可在 PyTorch 1.6 和 ONNX 1.7 w/ ONNX 运行时 1.4 中运行。Caffe2 兼容导出现在需要导出脚本中提到的附加参数(早期版本不需要)。

导出备注

  1. _EXPORTABLE除非标志 inconfig.py设置为 True ,否则激活了“SAME”conv 填充的 TF 移植权重无法导出到 ONNX 。config.set_exportable(True)onnx_export.py脚本中使用。
  2. 具有“相同”填充的 TF 移植模型将在导出时将填充固定为用于导出的分辨率。即使 opset >= 11 支持动态填充,我也无法让它工作。
  3. ONNX 优化工具在 PyTorch 1.6 / ONNX 1.7 中无法可靠运行。幸运的是,基于 onnxruntime 的推理现在运行良好,包括动态优化。
  4. ONNX / Caffe2 导出/导入经常因不同的 PyTorch 和 ONNX 版本版本而中断。请在此处提交问题之前检查他们各自的问题跟踪器。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

geffnet-1.0.2.tar.gz (40.1 kB 查看哈希

已上传 source

内置分布

geffnet-1.0.2-py3-none-any.whl (40.2 kB 查看哈希

已上传 py3