Я пытаюсь запустить модель TensorFlow lite на микроконтроллере, а именно на плате Sparkfun Edge , однако у меня возникают некоторые проблемы при загрузке модели на устройство. Вот шаги, которые я прошел:
- Обучил свою собственную модель в TensorFlow 2.1 с использованием
tf.keras
API - Выполнил полное целочисленное квантование весов и активаций, используя инструкции, приведенные на Сайт TensorFlow . Я не уверен, почему, но кажется, что я не смог получить модель с входами и выходами INT8, хотя я следовал предоставленным инструкциям. Фактически, вот как выглядит моя модель после квантования: Как видите, тип ввода моей модели по-прежнему
float32
, который становится int8
после прохождения через узел Quantize
. Точно так же у меня есть узел Dequantize
в направлении вывода графика, который делает прямо противоположное, а именно принимает значения int8
и преобразует их обратно в float32
, как показано ниже: Хотя это не так, как предполагалось (то есть int8
входы и выходы без Quantize
и Dequantize
узлов), это нормально, пока я могу заставить его работать - Отредактированный этот файл (как и некоторые другие файлы на самом деле, но этот является наиболее важным), который является частью примера приложения модели классификации изображений, работающей на плата Sparkfun Edge, размещенная в репозитории TensorFlow GitHub (это приложение использует C ++ API TensorFlow Lite для использования с микроконтроллерами). В частности, я заменил следующий код:
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, мне удалось перенести приложение sh на плату, но при запуске оно выдает следующую ошибку:
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(...)
(см. Последний фрагмент кода)