Не удается загрузить модель TensorFlow Lite на микроконтроллер - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь запустить модель TensorFlow lite на микроконтроллере, а именно на плате Sparkfun Edge , однако у меня возникают некоторые проблемы при загрузке модели на устройство. Вот шаги, которые я прошел:

  1. Обучил свою собственную модель в TensorFlow 2.1 с использованием tf.keras API
  2. Выполнил полное целочисленное квантование весов и активаций, используя инструкции, приведенные на Сайт TensorFlow . Я не уверен, почему, но кажется, что я не смог получить модель с входами и выходами INT8, хотя я следовал предоставленным инструкциям. Фактически, вот как выглядит моя модель после квантования: input Как видите, тип ввода моей модели по-прежнему float32, который становится int8 после прохождения через узел Quantize. Точно так же у меня есть узел Dequantize в направлении вывода графика, который делает прямо противоположное, а именно принимает значения int8 и преобразует их обратно в float32, как показано ниже: enter image description here Хотя это не так, как предполагалось (то есть int8 входы и выходы без Quantize и Dequantize узлов), это нормально, пока я могу заставить его работать
  3. Отредактированный этот файл (как и некоторые другие файлы на самом деле, но этот является наиболее важным), который является частью примера приложения модели классификации изображений, работающей на плата 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(...) (см. Последний фрагмент кода)

1 Ответ

0 голосов
/ 25 февраля 2020

У меня та же ошибка при использовании последней версии Tensorflow (и tf-nightly). Я уже открыл проблему, а также другой пользователь на Github Tensorflow здесь и здесь .

Я также получил ту же ошибку, что и вы, для 'QUANTIZE', когда используя «MicroOpResolver». Вы можете попробовать использовать «AllOpsResolver», но вы, вероятно, получите ту же проблему, что упоминалась в проблемах.

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