書籍『TinyML』 の要点メモ, その2
4,5,6章の要点メモです。 その1の続きです。 (要点と私の意見が混在していますがご容赦ください)
4,5,6章はこのサンプルの詳細な説明です。 github.com
4章: The "Hello World" of TinyML: Building and Training a Model
- ランダムノイズを加えた正弦波を入力、正弦波波形を教師データとして、正弦波を出力するモデルを訓練し、推論するサンプル
- 環境の説明(Jupter Notebook, Google Colab, Python, TensorFlow, Numpy, Keras)
- Kerasのモデル生成方法, fit, compile, predict メソッドを知っていれば、モデルの訓練までは斜め読みでok
- TFモデルをFlatBufferフォーマットのTFLモデルに変換する。詳細は12章。
- モデル変換時に最適化(量子化とか)も行う。詳細は13章。
- 量子化するときは入力値のフルレンジ(最大値、最小値)を含むrepresentative datasetを使う。(ダイナミックレンジと分解能を決めるために)
- xddコマンドを使ってCソースファイルに変換する
5章: The "Hello World" of TinyML: Building an Application
microcontroller上で推論アプリ(正弦波の推論)を動作させる。
- 簡易的なテストフレームワーク(TF_LITE_MICRI_TESTS)がある
- TFLモデルを読み込んで、型のテスト、shapeのテスト、スキーマのバージョンのテスト
- テンソル(入力、出力、中間テンソル)の記憶領域確保 ** どれくらいの領域を確保すればいいかはトライ&エラー(本当?
- インタープリタがTFLMの肝
- 入力が多次元配列でも平坦化してから入力値を設定する
- 組込みアプリではできるだけPCの環境でテストする。(組込みデバイスでのテストはPCのそれより大変なので)
- 組込みデバイス毎にデバイス固有のソースファイルが供給される
- このサンプルは↓の構造になっている
int main(int argc, char* argv[]) { setup(); /* モデル読み込み、モデルの形状や型の確認 */ while (true) { /* このアプリ(OSもない)しか動作しないので無限ループ */ loop(); /* 推論、期待値と出力を比較 */ } }
- (細かく説明してくれているので理解はできると思うが、C/C++のコードを見たことがないとちょっと手間取るかも。)
6章: The "Hello World" of TinyML: Deploying to Microcontrollers
5章でビルドしたアプリを3つの組込みデバイス(Arduino Nano 33 BLE Sense, SparkFun Edge, STM32F746G Discovery kit)にデプロイする。 ただし、自分は SparkFun Edge を中心に読んだので、ほかの2つのデバイス固有の話は含まれません。