Google Edge TPU Coralで実行するMobilenetv2モデル(データに再トレーニングされた最後のレイヤー)を取得しようとしています。
私はこのチュートリアル https://www.tensorflow.org/lite/performance/post_training_quantization?hl=en に従って、トレーニング後の量子化を行いました。関連するコードは次のとおりです。
...
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()
Tflite量子化モデルを正常に生成しましたが、edgetpu_compilerを実行すると(このページ https://coral.withgoogle.com/docs/edgetpu/compiler/#usage )実行すると、次の出力が得られます。
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
モデルの入力形状は3チャネルRGB画像です。 3チャンネル画像で完全な整数量子化を行うことは可能ですか? TensorFlowとGoogle Coralのドキュメントではどちらもできないということは何も見つかりませんでした。
同様のエラーが発生し、tf-nightlyビルド1.15でトレーニング後の完全な整数量子化を実行し、その.tfliteファイルを使用してEdge TPUコンパイラーでコンパイルすると、機能するはずです。私のエラーはこのアプローチで解決されました。
同じ問題がgithubで発生しました、あなたはそれを見ることができます- here
同じ問題と同じエラーメッセージがあります。 tensorflow.keras.applications mobilenetv2を使用してMobilenetV2を再トレーニングしました。私のモデルとCoralのサンプルモデル( https://coral.withgoogle.com/models/ )のTFLiteテンソルにいくつかの大きな違いがあることがわかりました。
まず、入力と出力のタイプが異なります。私のtf.kerasモデルをtfliteに変換すると、モデルの例は整数型ですが、浮動小数点型の入力および出力テンソルが含まれています。コマンドライン変換とpython tensorflow-liteからの変換( https://www.tensorflow.org/lite/convert/ )を使用する場合、これは異なります。コマンドライン変換は整数型ioを出力しますが、python変換は浮動小数点型ioを出力します(これは本当に奇妙です。)
次に、サンプルモデルにはバッチ正規化(BN)レイヤーはありませんが、Keras MobilenetV2にはいくつかのBNがあります。 'エラーの数:量子化された次元は[0、1)の範囲内でなければなりません。 3.だったKerasモデルには17のBNレイヤーがあるため、BNの数に関連しています。
私はまだこの問題に苦労しています。私はそれを解決するためにコーラルの再訓練の例に従うだけです。 ( https://coral.withgoogle.com/docs/edgetpu/retrain-detection/ )
この問題はtensorflow1.15-rcで修正されています。新しいtfバージョンでモデルをTFLiteに変換します。その後、TFLiteモデルはTPUコンパイラで機能します。
そして、TFliteモデルの入力と出力をuint8タイプとして作成するこれらの行を配置します。 (ただし、tf.int8である必要があります。)
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
以下のリンクを確認してください。 https://www.tensorflow.org/lite/performance/post_training_quantization
最新のコンパイラバージョンに更新した後も、この問題が発生しますか?
Edge TPU Compiler version 2.0.267685300