Android Tensorflow Lite最佳做法和优化

262 篇文章 9 订阅
39 篇文章 1 订阅

目录

后优化的预训练网络

修剪网络

下一步


在这里,我们看一下对于预训练网络,如何通过量化来改变网络。我们还将讨论如果模型与8位量化不兼容,则如何将网络转换为使用16位。最后,我们快速查看网络修剪。

在本系列的前一部分中,我们完成了基于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模型优化软件包包含一个称为prune_low_magnitude的方法,该方法将在网络上执行这些修改。

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

下一步

现在我们已经学到了更多有关有效使用TensorFlow Lite的知识,我们已经准备好进一步深入研究了。在接下来的文章中,我们将学习如何培养我们自己的神经网络中使用的Android应用程序。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值