无法将 tf.keras 模型正确转换为珊瑚 TPU 的量化格式

Posted

技术标签:

【中文标题】无法将 tf.keras 模型正确转换为珊瑚 TPU 的量化格式【英文标题】:Unable to properly convert tf.keras model to quantized format for coral TPU 【发布时间】:2020-06-01 05:15:51 【问题描述】:

我正在尝试使用最新的 tf-nighltymobilenetv2tf.keras 模型与 转置卷积 进行转换/强>。这是转换代码

#saved_model_dir='/content/ksaved'  # tried from saved model also
#converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)

converter = tf.lite.TFLiteConverter.from_keras_model(reshape_model)
converter.experimental_new_converter=True
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

converter.representative_dataset = representative_dataset_gen

tflite_quant_modell = converter.convert()
open("/content/model_quant.tflite", "wb").write(tflite_quant_modell)

转换成功(在google colab中);但它在末端有量化和去量化运算符(如使用 netron 所见)。似乎支持所有运算符。 代表性数据集图像在生成器中为float32,模型默认为4通道float32输入。看起来我们需要 coral TPUUINT8 输入和输出 内部模型。我们如何才能正确地进行这种转换?

参考:-

    Full integer quantization of weights and activations

    How to quantize inputs and outputs of optimized tflite model

    Coral Edge TPU Compiler cannot convert tflite model: Model not quantized

我尝试使用 'tf.compat.v1.lite.TFLiteConverter.from_keras_model_file' 而不是 v2 版本。在尝试量化最新 tf 1.15 中的模型(使用代表性数据集)和“Internal compiler error. Aborting!”来自使用 tf2.0 量化 tflite 的珊瑚 tpu 编译器

Tflite模型@https://github.com/tensorflow/tensorflow/issues/31368

它似乎一直有效,直到最后一个宪法块 (1x7x7x160) 编译器错误(Aborting)未提供有关潜在原因的任何信息,并且根据珊瑚文档似乎支持所有类型的卷积层。

珊瑚文档:https://coral.ai/docs/edgetpu/models-intro/#quantization

【问题讨论】:

【参考方案1】:

Here 是量化 keras 模型的虚拟模型示例。请注意,我在示例中使用了严格的 tf1.15,因为不推荐使用 tf2.0:

converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8

使用from_keras_model api。我认为最令人困惑的是你仍然可以调用它但什么也没有发生。这意味着该模型仍将接受浮点输入。我注意到您使用的是 tf2.0,因为 from_keras_model 是一个 tf2.0 api。目前,Coral 仍然建议 using tf1.15 转换模型。我建议降级 tensorflow,或者甚至只使用它(在保留 tf2.0 的同时,它可能会或可能不会起作用):

tf.compat.v1.lite.TFLiteConverter.from_keras_model_file

更多信息here。

【讨论】:

我从链接中发现了这一点:github.com/tensorflow/tensorflow/issues/36707。问题是它具有转置 conv 并且转换器不支持,除了最近的 tf-nigtly。此外,UINT8 输入或输出类型似乎会在模型端点创建量化和去量化操作符(我使用 INT8 代替)。虽然我已成功转换为 tf2.0 中的量化 tfllit,但我不确定我是否可以转换为珊瑚 tpu 格式,因为它包含 ADD_V2、TRANSPOSE_CONV_V2 等操作符。在最坏的情况下,我将不得不使用调整大小双线性和训练我又想.. 我收到错误:“op: TRANSPOSE_CONV 尚不支持量化”,同时尝试在最新的 tf 1.15 中量化模型(使用代表性数据集)和“内部编译器错误。中止!”来自珊瑚 tpu 编译器使用 tf2.0 量化的 tflite。【参考方案2】:

我始终确保不使用实验性转换器:

converter.experimental_new_converter = False

【讨论】:

以上是关于无法将 tf.keras 模型正确转换为珊瑚 TPU 的量化格式的主要内容,如果未能解决你的问题,请参考以下文章

使用 tf.keras.estimator.model_to_estimator 将 keras 模型转换为估计器模型后使用 estimator.train() 的问题

tensorflow 为 tensorflowjs 转换 keras 模型

从不同版本的 tf.keras 加载保存的模型(从 tf 2.3.0 到 tf 1.12)

如何将签名密钥添加到 keras 模型

tf2.0 Keras:使用 RNN 的自定义张量流代码时无法保存权重

tf.keras 模型到 coreml 模型,不支持 BatchNormalization