EfficientNet-lite詳解:當前最強移動端輕量神經網路

概述

3.17日Google在 GitHub 與 TFHub 上同步發布了 EfficientNet-lite,EfficientNet的端側版本,運行在 TensorFlow Lite 上,針對端側 CPU、GPU 和 EdgeTPU 做了優化。EfficientNet-lite提供五個不同版本(EfficientNet-lite0~4),讓用戶能夠根據自己的應用場景和資源情況在延遲、參數量和精度之間做選擇。

EfficientNet-Lite4 是計算量最大的版本,在 ImageNet上的top-1準確率達到了80.4%,同時能夠以30ms/image的速度運行在 Pixel 4 的 CPU 上。EfficientNet-lite 具體的精度和延時參數的關係如下圖所示。可見其已經把MobileNet V2,ResNet 50,Inception v4等模型遠遠甩在背後。

原理

EfficientNet-lite進行了一系列的優化:

量化。定點運算的速度要比浮點運算快很多,在移動設備算力有限的場景下,量化必不可少。但量化使用了定點數,表示範圍相對於浮點數小很多,必然存在精度的損失。藉助 TensorFlow Lite 中提供的訓練後量化流程來對模型進行量化處理,儘可能地降低了對準確率的影響。通過量化,模型大小減少為1/4,推理速度提升近2倍。

EfficientNet-lite0 浮點模型float32與int8量化版本在模型尺寸、精度及時延的對比:

結構和運算元優化。去除 squeeze-and-excitation 結構,因為目前在端側設備上支援欠佳。

使用 Relu6替代swish 激活函數,swish激活複雜度高,並且對量化有不利影響。

放縮模型尺寸時固定 stem 與 head 模組,減少放縮後模型的大小與計算量。

使用

對於用戶個性化的數據集,建議使用 TensorFlow Lite Model Maker,在已有 TensorFlow 模型上使用遷移學習。TensorFlow Lite Model Maker 支援很多模型結構,包括 MobileNetV2 和所有5個版本的 EfficientNet-Lite。以下為使用 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 參數,可以嘗試不同的模型。模型建立好以後,可以將其構建為移動端 app,把自己個性化的模型存放在 asset 文件夾。

展望

EfficientNet-lite是端側部署的福音,沒有特別複雜的運算元,時延低,精度高,輕易打敗了MobileNet,大家可以把以前用的MobileNet替換掉了。

附錄

官方Github:

https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet/lite

官方Blog:

https://blog.tensorflow.org/2020/03/higher-accuracy-on-vision-models-with-efficientnet-lite.html

EfficientNet論文鏈接:https://arxiv.org/abs/1905.11946