65.9K
CodeProject 正在变化。 阅读更多。
Home

Android TensorFlow Lite 最佳实践和优化

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2020年9月22日

CPOL

2分钟阅读

viewsIcon

7026

在本文中,我们将探讨进一步优化网络的方法。

在本系列文章的前一部分中,我们完成了基于 TensorFlow Lite 的应用程序的构建,该应用程序使用来自 ONNX Model Zoo 的网络模型执行对象识别。 让我们考虑一下可以进一步优化网络的方法。

对于神经网络模型,一个挑战在于在可用资源和准确性之间取得平衡。 一般来说,如果模型变得更复杂,它有可能更准确,但它会消耗更多的存储空间,执行时间更长,或者在下载时消耗更多的网络带宽。 并非所有优化都可以在所有硬件上运行。

对预训练网络进行后期优化

如果您使用的是来自第三方的网络,则提高性能的尝试可能从后期训练优化开始。

对于预训练的网络,可以通过量化来改变网络。 量化降低了网络参数的精度。 这些通常是 32 位浮点数。 当量化应用于网络时,浮点运算可以转换为整数或 16 位浮点运算。 这些运算将以更高的速度运行,但准确性会略有降低。 在本系列文章的早期部分,我使用 Python 代码将模型从 TensorFlow 转换为 TensorFlow Lite。 通过一些修改,转换器还将在转换时执行 8 位整数量化

import tensorflow as tf

saved_model_dir='/dev/projects/models'
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
tf_lite_model = converter.convert()
open('output.tflite', 'wb').write(tf_lite_model)

并非所有模型都可以这样转换。 如果模型与 8 位量化不兼容,则上述代码将抛出错误。 人们可能会想,除了 DEFAULT 之外,还可以将哪些值传递给 converter.optimizations。 在 TensorFlow 的早期版本中,可以传递值来优化网络的大小或延迟。 这些值目前已被弃用,现在将不会对结果产生任何影响。

如果 32 位浮点数到 8 位整数量化过于极端,可以将网络转换为使用 16 位浮点数。

import tensorflow as tf

saved_model_dir='/dev/projects/models'
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_types = [tf.float16]
tf_lite_model = converter.convert()
open('output.tflite', 'wb').write(tf_lite_model)

使用上述模型量化,只有在模型在支持 16 位浮点数的硬件(例如 GPU)上执行时,才能体验到优势。 如果在 CPU 上执行,网络权重将在执行之前扩展为 32 位浮点数。 在 CPU 上,将会有等效的未优化网络的准确性略有下降,但性能没有提高。

修剪网络

为了优化网络的大小,请考虑网络修剪。 在修剪中,对准确性贡献较小的网络部分进行删除,从而使生成的网络可以更紧凑地压缩。 要对网络执行修剪,需要安装一个额外的 tensorflow 库

pip install -q tensorflow-model-optimization

在 Python 代码中,在构建网络模型之后,TensorFlow Model Optimization 包包含一个名为 prune_low_magnitude 的方法,该方法将对网络执行这些修改。

import tensorflow_model_optimization as tfmot
pruned_model = tfmot.sparsity.keras.prune_low_magnitude(source_model)

后续步骤

现在我们已经了解了更多关于有效使用 TensorFlow Lite 的知识,我们就可以深入研究了。 在 下一篇文章 中,我们将学习如何训练我们自己的神经网络,以便在 Android 应用程序中使用。

© . All rights reserved.