MLコミュニティデーは11月9日です! TensorFlow、JAXからの更新のために私たちに参加し、より多くの詳細をご覧ください

マイクロコントローラーを使い始める

このドキュメントでは、マイクロコントローラーを使用してモデルをトレーニングし、推論を実行する方法について説明します。

HelloWorldの例

Hello Worldの例は、マイクロコントローラのためTensorFlowライトを使用しての絶対的な基礎を発揮するように設計されています。私たちは、訓練し、実行正弦関数を複製したモデルを、すなわち、それはその入力として、単一の番号を取り、数の出力正弦値を。マイクロコントローラーに展開されると、その予測はLEDを点滅させるか、アニメーションを制御するために使用されます。

エンドツーエンドのワークフローには、次の手順が含まれます。

  1. 鉄道模型の列車にjupyterノートブック、変換およびオンデバイスの使用のためのモデルを最適化:(Pythonで)を。
  2. ラン推論(C ++ 11で):使用してモデルに推論を実行し、エンドツーエンドのユニットテストC ++ライブラリを

サポートされているデバイスを入手する

使用するサンプルアプリケーションは、次のデバイスでテストされています。

でサポートされているプラットフォームの詳細情報マイクロコントローラ用TensorFlowライト

モデルをトレーニングする

使用するGoogle Colaboratoryする独自のモデルを訓練します。詳細については、を参照してください。 README.md

Hello World Training README.md

推論を実行する

お使いのデバイス上でモデルを実行するために、我々は内の命令を歩きますREADME.md

Hello World README.md

次のセクションでは、例の中を歩くhello_world_test.ccマイクロコントローラ用のTensorFlowライトを使用して推論を実行する方法を示し、ユニットテスト。モデルをロードし、推論を数回実行します。

1.ライブラリヘッダーを含める

TensorFlow Lite for Microcontrollersライブラリを使用するには、次のヘッダーファイルをインクルードする必要があります。

#include "tensorflow/lite/micro/all_ops_resolver.h"
#include "tensorflow/lite/micro/micro_error_reporter.h"
#include "tensorflow/lite/micro/micro_interpreter.h"
#include "tensorflow/lite/schema/schema_generated.h"
#include "tensorflow/lite/version.h"

2.モデルヘッダーを含める

TensorFlow Lite for Microcontrollersインタープリターは、モデルがC ++配列として提供されることを想定しています。モデルがで定義されているmodel.hmodel.ccファイル。ヘッダーは次の行に含まれています。

#include "tensorflow/lite/micro/examples/hello_world/model.h"

3.ユニットテストフレームワークヘッダーを含める

単体テストを作成するために、次の行を含めることで、マイクロコントローラー用のTensorFlowLite単体テストフレームワークを含めます。

#include "tensorflow/lite/micro/testing/micro_test.h"

テストは、次のマクロを使用して定義されます。

TF_LITE_MICRO_TESTS_BEGIN

TF_LITE_MICRO_TEST(LoadModelAndPerformInference) {
  . // add code here
  .
}

TF_LITE_MICRO_TESTS_END

ここで、上記のマクロに含まれるコードについて説明します。

4.ロギングを設定します

ロギングを設定するには、 tflite::ErrorReporterポインタは、ポインタを使用して作成されtflite::MicroErrorReporterインスタンスを:

tflite::MicroErrorReporter micro_error_reporter;
tflite::ErrorReporter* error_reporter = &micro_error_reporter;

この変数はインタープリターに渡され、ログを書き込むことができます。マイクロコントローラは、多くの場合、ロギングのためのさまざまなメカニズムを持っているので、実装のtflite::MicroErrorReporterお使いの特定のデバイス用にカスタマイズされるように設計されています。

5.モデルをロードします

以下のコードでは、モデルからのデータを使用してインスタンス化されるcharアレイ、 g_modelで宣言され、 model.h 。次に、モデルをチェックして、そのスキーマバージョンが使用しているバージョンと互換性があることを確認します。

const tflite::Model* model = ::tflite::GetModel(g_model);
if (model->version() != TFLITE_SCHEMA_VERSION) {
  TF_LITE_REPORT_ERROR(error_reporter,
      "Model provided is schema version %d not equal "
      "to supported version %d.\n",
      model->version(), TFLITE_SCHEMA_VERSION);
}

6.オペレーションリゾルバーをインスタンス化します

AllOpsResolverインスタンスが宣言されています。これは、モデルで使用される操作にアクセスするためにインタープリターによって使用されます。

tflite::AllOpsResolver resolver;

AllOpsResolver大量のメモリを使用するマイクロコントローラ用TensorFlow Liteは、で利用可能なすべての操作をロードします。特定のモデルはこれらの操作のサブセットのみを使用するため、実際のアプリケーションは必要な操作のみをロードすることをお勧めします。

これは、別のクラスを使用して行われるMicroMutableOpResolver 。あなたは、マイクロスピーチ例の中でそれを使用する方法を見ることができますmicro_speech_test.cc

7.メモリを割り当てます

入力、出力、および中間配列用に一定量のメモリを事前に割り当てる必要があります。これは以下のように提供されるuint8_tサイズのアレイtensor_arena_size

const int tensor_arena_size = 2 * 1024;
uint8_t tensor_arena[tensor_arena_size];

必要なサイズは、使用しているモデルによって異なり、実験によって決定する必要がある場合があります。

8.インタプリタをインスタンス化します

私たちは、作成tflite::MicroInterpreterインスタンス変数を渡し、前に作成しました:

tflite::MicroInterpreter interpreter(model, resolver, tensor_arena,
                                     tensor_arena_size, error_reporter);

9.テンソルを割り当てます

私たちは、からメモリを割り当てるために通訳を伝えるtensor_arenaモデルのテンソルについて:

interpreter.AllocateTensors();

10.入力形状を検証します

MicroInterpreterインスタンスを呼び出すことによって、モデルの入力テンソルへのポインタを提供してくれることができる.input(0) 0最初の(そして唯一の)入力テンソルを示しました:

  // Obtain a pointer to the model's input tensor
  TfLiteTensor* input = interpreter.input(0);

次に、このテンソルを調べて、その形状とタイプが期待どおりであることを確認します。

// Make sure the input has the properties we expect
TF_LITE_MICRO_EXPECT_NE(nullptr, input);
// The property "dims" tells us the tensor's shape. It has one element for
// each dimension. Our input is a 2D tensor containing 1 element, so "dims"
// should have size 2.
TF_LITE_MICRO_EXPECT_EQ(2, input->dims->size);
// The value of each element gives the length of the corresponding tensor.
// We should expect two single element tensors (one is contained within the
// other).
TF_LITE_MICRO_EXPECT_EQ(1, input->dims->data[0]);
TF_LITE_MICRO_EXPECT_EQ(1, input->dims->data[1]);
// The input is a 32 bit floating point value
TF_LITE_MICRO_EXPECT_EQ(kTfLiteFloat32, input->type);

列挙値kTfLiteFloat32 TensorFlowライトデータタイプのいずれかへの参照である、とで定義されcommon.h

11.入力値を入力します

モデルに入力を提供するために、入力テンソルの内容を次のように設定します。

input->data.f[0] = 0.;

代表この場合、入力浮動小数点値0

12.モデルを実行します

モデルを実行するために、我々は呼び出すことができますInvoke()私たちにtflite::MicroInterpreterインスタンス:

TfLiteStatus invoke_status = interpreter.Invoke();
if (invoke_status != kTfLiteOk) {
  TF_LITE_REPORT_ERROR(error_reporter, "Invoke failed\n");
}

私たちは、戻り値、確認することができTfLiteStatus実行が成功したかどうかを判断するために、。可能な値TfLiteStatusで定義され、 common.h 、あるkTfLiteOkkTfLiteError

次のコードは、値があることを主張するkTfLiteOk 、意味推論が正常に実行されました。

TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, invoke_status);

13.出力を取得します

モデルの出力テンソルを呼び出すことによって取得することができoutput(0)上のtflite::MicroInterpreter0最初の(そして唯一の)出力テンソルを表します。

この例では、モデルの出力は2Dテンソル内に含まれる単一の浮動小数点値です。

TfLiteTensor* output = interpreter.output(0);
TF_LITE_MICRO_EXPECT_EQ(2, output->dims->size);
TF_LITE_MICRO_EXPECT_EQ(1, input->dims->data[0]);
TF_LITE_MICRO_EXPECT_EQ(1, input->dims->data[1]);
TF_LITE_MICRO_EXPECT_EQ(kTfLiteFloat32, output->type);

出力テンソルから直接値を読み取り、それが期待どおりであると断言できます。

// Obtain the output value from the tensor
float value = output->data.f[0];
// Check that the output value is within 0.05 of the expected value
TF_LITE_MICRO_EXPECT_NEAR(0., value, 0.05);

14.推論を再度実行します

コードの残りの部分は、推論をさらに数回実行します。いずれの場合も、入力テンソルに値を割り当て、インタープリターを呼び出し、出力テンソルから結果を読み取ります。

input->data.f[0] = 1.;
interpreter.Invoke();
value = output->data.f[0];
TF_LITE_MICRO_EXPECT_NEAR(0.841, value, 0.05);

input->data.f[0] = 3.;
interpreter.Invoke();
value = output->data.f[0];
TF_LITE_MICRO_EXPECT_NEAR(0.141, value, 0.05);

input->data.f[0] = 5.;
interpreter.Invoke();
value = output->data.f[0];
TF_LITE_MICRO_EXPECT_NEAR(-0.959, value, 0.05);

15.アプリケーションコードを読む

あなたは、このユニットテストを歩いていたら、にある例のアプリケーションコード、理解することができるはずmain_functions.cc 。同様のプロセスに従いますが、実行された推論の数に基づいて入力値を生成し、モデルの出力をユーザーに表示するデバイス固有の関数を呼び出します。