无法在微控制器上加载 TensorFlow Lite 模型

Cannot load TensorFlow Lite model on microcontroller

我正在尝试 运行 微控制器上的 TensorFlow lite 模型,即在 Sparkfun Edge 板上,但是我在将模型加载到设备时遇到了一些问题。以下是我完成的步骤:

  1. 使用 tf.keras API
  2. 在 TensorFlow 2.1 中训练了我自己的模型
  3. 使用 TensorFlow website 上提供的说明对权重和激活执行完全整数量化。我不确定为什么,但似乎我无法获得具有 INT8 输入和输出的模型,即使我按照提供的说明进行操作。事实上,这是我的模型在量化后的样子: 可以看到,我模型的输入类型还是float32,流过Quantize节点后变成了int8。同样,我有一个指向图表输出的 Dequantize 节点,它做的恰恰相反,即它采用 int8 值并将它们转换回 float32,如下所示: 虽然这不是它应该的样子(即 int8 输入和输出 没有 QuantizeDequantize 节点,但只要我可以让它工作
  4. 在 Sparkfun Edge 板上编辑 this file (as well as some other files actually, but this one is the most important one), which is part of an example application 图像分类模型 运行 并托管在 TensorFlow 的 GitHub 存储库中(此应用程序使用 TensorFlow Lite 的 C++ API与微控制器一起使用)。更具体地说,我替换了以下代码:
static tflite::MicroOpResolver<3> micro_op_resolver;
micro_op_resolver.AddBuiltin(
    tflite::BuiltinOperator_DEPTHWISE_CONV_2D,
    tflite::ops::micro::Register_DEPTHWISE_CONV_2D());
micro_op_resolver.AddBuiltin(tflite::BuiltinOperator_CONV_2D,
                             tflite::ops::micro::Register_CONV_2D());
micro_op_resolver.AddBuiltin(tflite::BuiltinOperator_AVERAGE_POOL_2D,
                             tflite::ops::micro::Register_AVERAGE_POOL_2D());

有了这个:

static tflite::MicroOpResolver<10> micro_op_resolver;

micro_op_resolver.AddBuiltin(
    tflite::BuiltinOperator_DEPTHWISE_CONV_2D,
    tflite::ops::micro::Register_DEPTHWISE_CONV_2D(),
    1,
    3
);

micro_op_resolver.AddBuiltin(
    tflite::BuiltinOperator_CONV_2D, 
    tflite::ops::micro::Register_CONV_2D(),
    1,
    3
);

micro_op_resolver.AddBuiltin(
    tflite::BuiltinOperator_AVERAGE_POOL_2D, 
    tflite::ops::micro::Register_AVERAGE_POOL_2D()
);

micro_op_resolver.AddBuiltin(
    tflite::BuiltinOperator_ADD, 
    tflite::ops::micro::Register_ADD()
);

micro_op_resolver.AddBuiltin(
    tflite::BuiltinOperator_SOFTMAX, 
    tflite::ops::micro::Register_SOFTMAX()
);

micro_op_resolver.AddBuiltin(
    tflite::BuiltinOperator_FULLY_CONNECTED, 
    tflite::ops::micro::Register_FULLY_CONNECTED()
);

micro_op_resolver.AddBuiltin(
    tflite::BuiltinOperator_QUANTIZE, 
    tflite::ops::micro::Register_QUANTIZE()
);

micro_op_resolver.AddBuiltin(
    tflite::BuiltinOperator_DEQUANTIZE, 
    tflite::ops::micro::Register_DEQUANTIZE(),
    1,
    2
);

micro_op_resolver.AddBuiltin(
    tflite::BuiltinOperator_RELU, 
    tflite::ops::micro::Register_RELU()
);

micro_op_resolver.AddBuiltin(
    tflite::BuiltinOperator_RELU6, 
    tflite::ops::micro::Register_RELU6()
);

这基本上注册了我的自定义模型中包含的所有不同层。 按照为 Sparkfun Edge 板提供的 instructions,我设法将应用程序闪存到板上,但是当我 运行 它时,它输出以下错误:

Didn't find op for builtin opcode 'QUANTIZE' version '1'

Failed to get registration from op code  d

AllocateTensors() failed

我不明白我做错了什么,因为 QUANTIZE 操作是用 micro_op_resolver.AddBuiltin(...) 注册的(请参阅最后一个代码片段)

我在使用最新版本的 Tensorflow(和 tf-nightly)时遇到了同样的错误。我已经在 Tensorflow 的 Github here and here.

上打开了一个问题以及另一个用户

我在使用 'MicroOpResolver' 时也遇到了与您相同的 'QUANTIZE' 错误。您可以尝试使用 'AllOpsResolver',但您可能会遇到与问题中提到的相同的问题。

static tflite::ops::micro::AllOpsResolver resolver;