使用 EfficientNet-Lite 提升视觉模型的准确率
2020 年 3 月 16 日
作者:Renjie Liu,软件工程师

2019 年 5 月,Google 发布了一系列名为 EfficientNet 的图像分类模型,它以更少的计算和参数实现了最先进的准确率。如果 EfficientNet 可以运行在边缘,它将为移动设备和物联网等计算资源受限的领域开辟新的应用。

今天,我们很高兴宣布 EfficientNet-Lite (GitHubTFHub),它运行在 TensorFlow Lite 上,并为移动 CPU、GPU 和 EdgeTPU 上的性能而设计。EfficientNet-Lite 将 EfficientNet 的强大功能带到边缘设备,并提供五个变体,允许用户从低延迟/模型大小选项 (EfficientNet-Lite0) 到高精度选项 (EfficientNet-Lite4) 中进行选择。最大的变体,仅使用整数量化的 EfficientNet-Lite4,在 ImageNet 上实现了 80.4% 的 top-1 准确率,同时仍然可以在 Pixel 4 CPU 上实时运行(例如,30 毫秒/图像)。以下是量化的 EfficientNet-Lite 模型与同类量化的一些流行图像分类模型的性能比较。
图表:仅使用整数量化的模型在 Pixel 4 CPU 上使用 4 个线程运行。

挑战:量化和异构硬件

边缘设备的独特特性带来了几个挑战。

**量化**:由于许多边缘设备的浮点运算支持有限,量化被广泛使用。但是,它通常需要复杂量化感知训练过程或导致量化后的模型准确率下降。

值得庆幸的是,在我们的工具集中,我们利用了 TensorFlow Lite 后训练量化工作流 以最小的准确率损失对模型进行量化。

**异构硬件**:在移动 GPU/EdgeTPU 等各种加速器上运行同一模型具有挑战性。由于硬件专门化,这些加速器通常只对有限的操作集表现良好。我们发现 EfficientNet 中的一些操作不受某些加速器的良好支持。

为了解决异构问题,我们对原始 EfficientNets 进行了以下简单的修改
  • 删除了 squeeze-and-excitation 网络,因为它们不受良好支持
  • 将所有 swish 激活替换为 RELU6,这显着提高了后训练量化的质量(稍后解释)
  • 在扩展模型时修复了 stem 和 head,以减少扩展模型的大小和计算量

使用 TensorFlow 模型优化工具进行后训练量化

借助 TensorFlow 模型优化工具,我们可以轻松地对模型进行量化,而不会通过仅使用整数的后训练量化损失太多准确率(有关更多信息,请参阅 链接)。这将模型大小减少了 4 倍,推理速度提高了 2 倍。
以下是 EfficientNet-Lite0 浮点模型与其量化版本在准确率和延迟方面的比较
* 基准测试在 Pixel 4 CPU 上使用 4 个线程运行
我们还希望分享我们关于后训练量化的经验。当我们第一次尝试后训练量化时,我们发现准确率大幅下降:ImageNet 数据集上的 top-1 准确率从 75% 下降到 46%。
我们发现问题是量化后的输出范围太宽。量化本质上是对浮点值进行仿射变换以适应 int8 范围内的桶
关于量化的插图
在我们的案例中,输出张量范围从 -168 到 204,如下例所示: 这是一个信号,表明我们可能损失了太多准确率,因为很难将范围很宽的浮点张量放入 int8 范围内的桶中。
为了解决这个问题,我们将 swish 激活 替换为“受限范围”激活(relu6),因为 relu6 将输出限制在 [0, 6] 范围内。进行此更改后,量化模型在 ImageNet 上的 top-1 准确率从浮点基线的 75.1% 回升至 74.4%。

立即在您的数据集中尝试 EfficientNet-Lite

让我们将 EfficientNet-Lite 的强大功能带到您的数据中。我们建议您使用 TensorFlow Lite 模型制造器,它是一个工具,可以使您能够将迁移学习应用于现有的 TensorFlow 模型,并使用用户的输入数据和将生成的模型导出到 TensorFlow Lite 格式。
TensorFlow Lite 模型制造器支持多种模型架构,包括 MobileNetV2 和 EfficientNet-Lite 的所有变体。以下是如何使用 5 行代码构建 EfficientNet-Lite0 图像分类模型的示例
# Load your custom dataset
data = ImageClassifierDataLoader.from_folder(flower_path)
train_data, test_data = data.split(0.9)

# Customize the pre-trained TensorFlow model
model = image_classifier.create(train_data, model_spec=efficienetnet_lite0_spec)

# Evaluate the model
loss, accuracy = model.evaluate(test_data)

# Export as TensorFlow Lite model.
model.export('image_classifier.tflite', 'image_labels.txt')
使用花卉分类 笔记本 尝试该库。您可以通过更改 model_spec 参数轻松切换到不同的模型。对于像 tf_flowers 这样的小型数据集,您可以使用 5 个时期在几分钟内获得 **~92% 的准确率**。如果您使用更多时期、更多数据进行训练,或微调整个模型,则可以提高准确率。
接下来,让我们用这个模型构建一个移动应用程序。您可以从我们的 图像分类 示例开始,这是一个使用 EfficientNet-Lite 构建的即用型移动应用程序。该应用程序使用 Gradle 任务 自动将预先训练在 ImageNet 数据集上的 EfficientNet-Lite 模型下载到 assets 文件夹中。如果您想尝试使用模型制造器创建的自定义模型,则可以将其替换到 assets 文件夹中。
如屏幕截图所示,EfficientNet-Lite 模型实时运行推理(>= 30 帧/秒)。

想了解更多?

构建我们的参考应用程序并使用它们(说明)。尝试在 TensorFlow Hub 上使用 EfficientNet-Lite 并使用 TensorFlow Lite 模型制造器 为您的任务自定义它们。在 tensorflow.org/lite 上了解有关 TensorFlow Lite 的更多信息,尝试 TensorFlow 模型优化,并在 tfhub.dev 上探索更多 TensorFlow Lite 模型。

致谢

Renjie Liu、Xunkai Zhang、Tian Lin、Yuqi Li、Mingxing Tan、Khanh LeViet、Chao Mei、Amy Jang、Luiz GUStavo Martins‎、Yunlu Li、Suharsh Sivakumar‎、Raziel Alvarez、Lawrence Chan、Jess Kim、Mike Liang、Shuangfeng Li、Sarah Sirajuddin

参考资料

[1] EfficientNet:重新思考卷积神经网络的模型扩展:https://arxiv.org/abs/1905.11946
下一篇文章
 Higher accuracy on vision models with EfficientNet-Lite

作者:Renjie Liu,软件工程师

2019 年 5 月,Google 发布了一系列名为 EfficientNet 的图像分类模型,它以更少的计算和参数实现了最先进的准确率。如果 EfficientNet 可以运行在边缘,它将为移动设备和物联网等计算资源受限的领域开辟新的应用。

今天,我们很高兴宣布…