目的
Coral USBアクセラレータを用いて推論を高速化しようと。
すると、kerasで特定のタスク用に転移学習(transfer learning)したモデルをCoralのedgetpu用に変換させる必要があります。
※コードは十分検証していますが、素人ですので誤りや説明に過不足がありましたら、ご指摘いただきますと幸いです。
手順
- keras(tensorflow)モデルを量子化(8bit)のtensorflow-lite(tflite)形式のモデルに変換。
- tfliteモデルを専用コンパイラでedgetpuモデルに変換。
試したこと
@iwatake2222 さんの以下の記事の方法(tflite_convertツール使用)ではうまくできませんでした。
Deep Learningアプリケーション開発 (7) TensorFlow Lite with Python on Raspberry Pi and Edge TPU
最終的にedgetpuモデルの変換までできましたが、推論の結果がみんな全部同じ値となってしまいました(自分があまり理解できず、パラメータの調整が下手くそだっただけかもしれません)。
解決策
tensorflow 2.0(Beta版)のTFLiteConverter.from_keras_model_fileのAPIを使用して、tfliteモデルに変換してから、edgetpuモデルに変換するとうまくいきました。
tfliteモデルへの変換
converter = tf.compat.v1.lite.TFLiteConverter.from_keras_model_file(kerasモデルパスの指定)
converter.representative_dataset = representative_dataset_gen ← 量子化のキャリブレーション用のデータを生成する関数
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
量子化のキャリブレーション用のデータを生成する関数。
def representative_dataset_gen():
for i in range(サンプル数):
yield [サンプルデータ[i: i + 1]]
ファイルに書き出します。
with open(model_name + '.tflite', 'wb') as o_:
o_.write(tflite_model)
edgetpuモデルへの変換
edgetpu_compiler tfliteモデルパスの指定
※edgetpuのインストールが必要。
サンプルコード
githubにアップしています(google colab用)。
https://github.com/seeouy/edgetpu_model_converter
※サンプルコードには、fashion_mnistのカスタムモデルを作成していますが、すでにトレーニング済みのモデルがある場合は、読み飛ばしてください。
精度の劣化
基本的に、edgetpuモデルは量子化(重み等の情報を通常の32ビットから8ビットに落とす)が必要なため、オリジナルモデルと比べると若干精度(accuracy)が劣ります。
検証
サンプルコードのモデルを用いて、オリジナルのkerasモデルおよびedgetpuモデルに変換した後の精度を評価しました。
モデル | accuracy |
---|---|
オリジナル | 0.6538 |
edgetpu(サンプル数=100) | 0.6535 |
edgetpu(サンプル数=1000) | 0.6537 |
以上の結果から、サンプル数を増やせば、オリジナルのaccuracyに近づけることができると考えられます。
※サンプル数とは、量子化のキャリブレーション用のデータを生成するときのサンプル数のこと。
参考