https://blog.tensorflowcn.cn/2020/03/higher-accuracy-on-vision-models-with-efficientnet-lite.html
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkW-QEUi2BQR3pO85B6XNSiw3DplipNxCzRUQx7RAY8jrpR6oWB22B8WUYtYZq5LR2H41PtbIjNzCK27qD3_OdrctcHSwA41YyhT7lglc69Zlx2ZKtPN7UbegeqeZvujd3iQggemU3QjE/s1600/figure1a.png
作者:Renjie Liu,软件工程师
2019 年 5 月,Google 发布了一系列名为
EfficientNet 的图像分类模型,它以更少的计算和参数实现了最先进的准确率。如果 EfficientNet 可以运行在边缘,它将为移动设备和物联网等计算资源受限的领域开辟新的应用。
今天,我们很高兴宣布
EfficientNet-Lite (
GitHub,
TFHub),它运行在
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