J'essaie d'obtenir un modèle Mobilenetv2 (dernières couches recyclées à mes données) pour fonctionner sur Google Edge TPU Coral.
J'ai suivi ce tutoriel https://www.tensorflow.org/lite/performance/post_training_quantization?hl=en pour faire la quantification post-formation. Le code pertinent est:
...
train = tf.convert_to_tensor(np.array(train, dtype='float32'))
my_ds = tf.data.Dataset.from_tensor_slices(train).batch(1)
# POST TRAINING QUANTIZATION
def representative_dataset_gen():
for input_value in my_ds.take(30):
yield [input_value]
converter = tf.lite.TFLiteConverter.from_keras_model_file(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset_gen
converter.target_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
tflite_quant_model = converter.convert()
J'ai réussi à générer le modèle quantifié tflite mais lorsque j'exécute edgetpu_compiler (suivi de cette page https://coral.withgoogle.com/docs/edgetpu/compiler/#usage ) j'obtiens cette sortie:
edgetpu_compiler Notebooks/MobileNetv2_3class_visit_split_best-val-
acc.h5.quant.tflite
Edge TPU Compiler version 2.0.258810407
INFO: Initialized TensorFlow Lite runtime.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
ERROR: quantized_dimension must be in range [0, 1). Was 3.
Invalid model: Notebooks/MobileNetv2_3class_visit_split_best-val-
acc.h5.quant.tflite
Model could not be parsed
La forme d'entrée du modèle est une image RVB à 3 canaux. Est-il possible de faire une quantification entière complète sur des images à 3 canaux? Je n'ai rien trouvé qui dise que vous ne pouvez pas non plus sur la documentation TensorFlow et Google Coral.
J'ai eu des erreurs similaires, en effectuant la quantification intégrale complète après la formation avec tf-nightly build 1.15 et l'utilisation de ce fichier .tflite, compilé avec le compilateur Edge TPU, cela devrait fonctionner. mon erreur a été résolue avec cette approche.
Le même problème a été soulevé dans github, vous pouvez le voir - ici
J'ai le même problème et le même message d'erreur. J'ai recyclé MobilenetV2 en utilisant tensorflow.keras.applications mobilenetv2. J'ai trouvé qu'il y a de grandes différences dans les tenseurs TFLite entre mon modèle et l'exemple de modèle de Coral ( https://coral.withgoogle.com/models/ ).
Premièrement, les types d'entrée et de sortie sont différents. Lorsque je convertis mon modèle tf.keras en tflite, il contient des tenseurs d'entrée et de sortie de type flottant tandis que l'exemple de modèle a un type entier. C'est différent si j'utilise une conversion en ligne de commande et une conversion python de tensorflow-lite ( https://www.tensorflow.org/lite/convert/ ) . La conversion en ligne de commande génère le type entier io, mais python génère le type float io. (C'est vraiment étrange.)
Deuxièmement, il n'y a pas de couche de normalisation par lots (BN) dans l'exemple de modèle, mais il existe des BN dans Keras MobilenetV2. Je pense que le nombre de 'ERREUR: dimension_dimensionnée doit être dans la plage [0, 1). Était 3. ' est lié au nombre de BN car il y a 17 couches BN dans le modèle Keras.
Je suis toujours aux prises avec ce problème. Je vais juste suivre l'exemple de recyclage du Coral pour le résoudre. ( https://coral.withgoogle.com/docs/edgetpu/retrain-detection/ )
Ce problème est résolu dans tensorflow1.15-rc. Convertissez votre modèle en TFLite dans la nouvelle version tf. Ensuite, le modèle TFLite fonctionnera dans le compilateur TPU.
Et mettez ces lignes qui font de l'entrée et de la sortie du modèle TFlite un type uint8. (Je pense que cela devrait être tf.int8 cependant.)
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
Consultez le lien ci-dessous. https://www.tensorflow.org/lite/performance/post_training_quantization
Avez-vous toujours ce problème après la mise à jour vers la dernière version du compilateur?
Edge TPU Compiler version 2.0.267685300