Tensorflow lite для микроконтроллера Sparkfun Edge, операция для встроенного кода операции CONV_2D версии 2 и 3 не найдена
Я пытаюсь использовать свою модель TFlite с микроконтроллером Sparkfun Edge (Apollo 3) для распознавания простых мелодий, таких как (do re mi fa ....) из приложения Piano. Я использовал следующий код Python с tensorflow v2
from tensorflow.keras import layers......
model = tf.keras.Sequential([
layers.InputLayer(input_shape=(2048,)),
layers.Reshape(target_shape=(1,2048,1)),
layers.Conv2D(8,(1,8),strides=(1,8)),
layers.MaxPool2D((1,2),strides=(1,2)),
layers.Conv2D(8,(1,8),strides=(1,8)),
layers.MaxPool2D((1,2),strides=(1,2)),
layers.Reshape(target_shape=(64,)) ,
layers.Dense(8,activation="softmax")
])
model.build(input_shape=(2048,))
model.compile(optimizer="adam",loss="binary_crossentropy")
Я обучаю модель и конвертирую ее с помощью следующего кода
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS]
model_tflite = converter.convert()
open('model.tflite', "wb").write(model_tflite)
!apt-get install xxd
!xxd -i 'model.tflite' > 'model.cc'
!cat 'model.cc'
Я получил следующий отладочный вывод от микроконтроллера:
setup_NN invoked ///
Model TFLITE_SCHEMA_VERSION OK ///
interpreter OK ///
AllocateTensors OK ///
________________
in_dim= 2 ///
input_type = kTfLiteFloat32 ///
in_size[0]= 1 ///
in_size[1]= 2048 ///
________________
out_dim= 2 ///
output_type = kTfLiteFloat32 ///
out_size[0]= 1 ///
out_size[1]= 8 ///
________________
Setup OK
Loop funktion inoked
**Didn't find op for builtin opcode 'CONV_2D' version '2'**
Invoke failed
___________________
когда я изменил
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS]
to
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
with adding a
representative_dataset function
я получил сообщение об ошибке: Не нашел цит для встроен опкода "CONV_2D" версии "3"
Я думаю, что Sparkfun Edge MC принимает float32 в качестве входных данных, мне нужно попробовать с tenorflow.compat.v1 вместо v2? не могли бы вы указать, где не так, или просто показать мне рабочий пример?
хорошо сказать, что другая модель, такая как sine_model, только с полностью подключенными слоями + активации отлично работала со мной (в float32), но мне действительно нужны слои conv, я знаю, что лучше использовать Conv1D, но я где-то читал, что это не поддерживается