当前位置: 首页 > 知识库问答 >
问题:

TensorFlow假定量层也从TF-Lite中调用

卢骏俊
2023-03-14

我正在使用TensorFlow 2.1,以便通过量化感知训练来训练模型。

执行此操作的代码是:

import tensorflow_model_optimization as tfmot
model = tfmot.quantization.keras.quantize_annotate_model(model)

这将向图形中添加伪量化节点。这些节点应该调整模型的权重,以便更容易量化为int8并处理int8数据。

当训练结束时,我将模型转换并量化为TF-Lite,就像这样:

converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = [give data provider]
quantized_tflite_model = converter.convert()

在这一点上,我不希望在TL-Lite图中看到假量化层。但令人惊讶的是,我确实看到了它们。此外,当我在TF-Lite C示例应用程序中运行这个量化模型时,我看到它也在推理过程中运行假量化节点。除此之外,它还去量化和量化每个层之间的激活。

这是C代码输出的一个示例:

节点0操作员内置代码80伪量化输入:1
输出:237
节点1操作员内置代码114量化输入:237
输出:238
节点2操作员内置代码3转换2D
输入:238 59 58
输出:167
临时:378
节点3操作员内置代码6反量化输入:167
输出:239
节点4操作员内置代码80伪量化输入:239输出:166输入:166输入:166输出:169

所以我觉得这一切都很奇怪,同时考虑到这个模型应该只在int8上运行,实际上假量化节点作为输入是浮动的。

这里的任何帮助都将不胜感激。

共有3个答案

姚晋
2023-03-14

我也遇到过同样的问题。在我的例子中,量化的tflite模型的大小随着假量化增加了约3倍。你有没有想过?检查Netron中的tflite图显示每个操作之间插入了量化层。

到目前为止,我的解决方法是在没有伪量化的情况下启动模型的新副本,然后从量化感知训练模型中按层加载权重。它不能直接为整个模型设置权重,因为伪量化层也有参数。

萧越泽
2023-03-14

您可以强制TF Lite仅使用INT操作:

converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]

如果发生错误,则网络的某些层还没有INT8实现。

此外,您还可以尝试使用Netron调查您的网络。

尽管如此,如果您还想要INT8输入和输出,您还需要调整这些输入和输出:

converter.inference_input_type = tf.int8
converter.inference_output_type = tf.int8

但是,目前有一个关于输入和输出的公开问题,请参见问题#38285

朱博实
2023-03-14

代表性_数据集主要用于训练后量化。

将您的命令与QAT示例进行比较,您可能希望删除该行。

https://www.tensorflow.org/model_optimization/guide/quantization/training_example

converter = tf.lite.TFLiteConverter.from_keras_model(q_aware_model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]

quantized_tflite_model = converter.convert()


# Create float TFLite model.
float_converter = tf.lite.TFLiteConverter.from_keras_model(model)
float_tflite_model = float_converter.convert()

# Measure sizes of models.
_, float_file = tempfile.mkstemp('.tflite')
_, quant_file = tempfile.mkstemp('.tflite')

with open(quant_file, 'wb') as f:
  f.write(quantized_tflite_model)

with open(float_file, 'wb') as f:
  f.write(float_tflite_model)

print("Float model in Mb:", os.path.getsize(float_file) / float(2**20))
print("Quantized model in Mb:", os.path.getsize(quant_file) / float(2**20))
 类似资料:
  • 我有一个关于tf的问题。图层。conv3d。如果我理解正确,它需要输入形状 (批次x深度x高度x宽度x通道) 其中通道应该只有一个;给定一个过滤器(深度x高度x宽度),它创建#个过滤器相同形状的不同过滤器以创建#个过滤器输出通道并将它们与输入卷积以获得形状的输出 (批次x out\u深度x out\u高度x out\u宽度x num\u过滤器) 首先,我现在是对的吗?问题是:在我看来,这一层不符合

  • TensorFlow Lite 是一款 TensorFlow 用于移动设备和嵌入式设备的轻量级解决方案。 TensorFlow 可以在多个平台上运行,从机架式服务器到小型 IoT 设备。但是随着近年来机器学习模型的广泛使用,出现了在移动和嵌入式设备上部署它们的需求。而 TensorFlow Lite 允许设备端的机器学习模型的低延迟推断。 设计初衷 轻量级:允许小 binary size 和快速初

  • 我正在构建一个Tensorflow模型来预测每个用户的特定功能。因此,我为应用程序的每个用户创建了一个模型。我想知道如何将Tensorflow lite模型上传到Firebase,这样每个用户都可以访问他/她特定的模型。例如,假设有两个用户A和B。当A调用firebase时,我想确保A的模型被调用,当B使用应用程序时,我要确保B的模型被激活。希望这是有意义的,有人能告诉我是否有办法做到这一点。非常

  • 转换后的tensorflow lite模型是否始终具有量化计算和输出?还是取决于tensorflow模型的输入和推理类型?

  • 我用一个卷积层建立了一个简单的CNN模型,并用Tensorflow Lite进行了转换。(对于MNIST!!)所以现在我的模型得到8位整数输入,权重也是8位整数。 我想测试从TFLite获得的参数,所以我为推理步骤编写了C代码。 输入图像像素被赋予0到255之间的8位整数,权重在-128到127之间。(偏差是32位整数。)当然,卷积结果由大于255的数字组成。 我检查了这份文件(https://a

  • 有没有办法了解tflite使用GPU的情况,以及它与谁竞争GPU资源? 我有一个在android上使用tflite和GPU委托的应用程序。 它有时可以以15帧/秒的速度处理图像,有时可以以3帧/秒的速度处理图像,而无需对应用程序进行任何更改。 我想了解是什么导致它在这两种速度之间切换。我怀疑这与其他应用程序有关,比如同时使用GPU的摄像头。 有什么工具可以帮助我了解我的应用程序是否真的有效地使用了