【发布时间】:2020-02-24 16:31:26
【问题描述】:
我正在尝试在微控制器上运行 TensorFlow lite 模型,即在 Sparkfun Edge 板上,但是我在将模型加载到设备时遇到了一些问题。以下是我经历的步骤:
- 使用
tf.kerasAPI 在 TensorFlow 2.1 中训练我自己的模型 - 使用TensorFlow website 上提供的说明对权重和激活执行全整数量化。我不知道为什么,但似乎我无法获得具有 INT8 输入和输出的模型,即使我按照提供的说明进行操作。事实上,这是我的模型在量化后的样子:
可以看到,我模型的输入类型还是
float32,流过Quantize节点后变成int8。同样,我有一个指向图形输出的Dequantize节点,它的作用正好相反,即它采用int8值并将它们转换回float32,如下所示: 虽然这不是它应该的样子(即int8输入和输出没有Quantize和Dequantize节点),但只要我能让它工作就可以了 - 编辑了this file(实际上还有一些其他文件,但这是最重要的文件),它是在 Sparkfun Edge 板上运行并托管在 TensorFlow 的 GitHub 上的图像分类模型的example application 的一部分存储库(此应用程序使用 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(...)(请参阅最后的代码 sn-p)
【问题讨论】:
标签: c++ microcontroller tensorflow-lite