Edge TPUでの転移学習

上記の要件に準拠する独自のモデルを構築して最初からトレーニングする代わりに、Transfer Learning（「微調整」とも呼ばれます）と呼ばれる手法を使用して、Edge TPUと既に互換性のある既存のモデルを再トレーニングできます。

![unnamed-_2_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/73c44327-88b7-5ae3-75b9-66ce3b8d3ff5.jpeg)


ニューラルネットワークを最初からトレーニングする（計算された重みやバイアスがない場合）には、数日分の計算時間がかかり、膨大な量のトレーニングデータが必要になります。ただし、転移学習を使用すると、関連タスクについて既にトレーニングされたモデルから開始し、さらにトレーニングを実行して、より小さなトレーニングデータセットを使用してモデルに新しい分類を教えることができます。モデル全体を再トレーニングすることでこれを行うことができます（ネットワーク全体で重みを調整します）が、分類を実行する最終レイヤーを削除するだけで非常に正確な結果を達成し、新しいクラスを認識する新しいレイヤーをトレーニングすることもできます。

このプロセスを使用して、十分なトレーニングデータとハイパーパラメーターの調整を行うことにより、1回で非常に正確なTensorFlowモデルを作成できます。モデルのパフォーマンスに満足したら、単純にTensorFlow Liteに変換し、Edge TPU用にコンパイルします。また、モデルのアーキテクチャは転移学習中に変更されないため、Edge TPU向けに完全にコンパイルされることがわかっています（互換性のあるモデルから開始すると仮定します）。

転移学習にすでに精通している場合は、独自のモデルを作成するための出発点として使用できるEdge TPU互換モデルを確認してください。 「すべてのモデルファイル」をクリックしてダウンロードし、TensorFlowモデルと、転移学習を開始するために必要な事前トレーニング済みのチェックポイントを取得します。

この手法を初めて使用し、いくつかの結果をすぐに見たい場合は、新しいクラスでMobileNetモデルを再トレーニングするプロセスを簡素化する次のチュートリアルを試してください。

- [画像分類モデルを再訓練する] (https://coral.withgoogle.com/docs/edgetpu/retrain-classification/)
- [オブジェクト検出モデルを再トレーニングする] (https://coral.withgoogle.com/docs/edgetpu/retrain-detection/)

### デバイス上の学習を転送します
画像分類モデルを使用している場合は、Edge TPUで高速転送学習を実行することもできます。 Python APIは、デバイス上での転送学習のために2つの異なる手法を提供します。

- 最後のレイヤーの重量刷り込み（ImprintingEngine）
- 最後の層での逆伝播（SoftmaxRegression）

どちらの場合も、最後のレイヤーでトレーニングできるように特別に設計されたモデルを提供する必要があります。必要なモデル構造はAPIごとに異なりますが、結果は基本的に同じです。分類が発生する最後の完全に接続されたレイヤーは、グラフのベースから分離されています。次に、グラフのベースのみがEdge TPU用にコンパイルされ、最後のレイヤーの重みがトレーニングのためにアクセス可能になります。モデルアーキテクチャの詳細については、以下の対応するドキュメントをご覧ください。とりあえず、各手法の再トレーニングの仕組みを比較しましょう。

重みのインプリンティングは、ベースモデルからの出力（埋め込みベクトル）を取得し、L2正規化で活性化ベクトルを調整し、それらの値を使用して最終層の新しい重みを計算します。新しいベクトルを既に最後の層の重みで平均します。これにより、非常に少ないサンプル画像で新しいクラスを効果的にトレーニングできます。

バックプロパゲーションは、従来のバックプロパゲーションの短縮版です。グラフ内のすべてのレイヤーに新しい重みを逆伝播する代わりに、グラフの最後にある完全に接続されたレイヤーのみを新しい重みで更新します。これは一般的に高い精度を達成する従来のトレーニング戦略ですが、より多くの画像と複数のトレーニングの反復が必要です。

これらのトレーニング手法を選択するときは、次の要因を考慮する必要があります:

- **トレーニングサンプルサイズ**：トレーニングサンプルの比較的小さなセットがある場合、ウェイトインプリンティングはより効果的です：各クラスの1から200サンプルイメージのいずれか（5が有効で、APIが最大200に設定できます）。トレーニングに使用できるサンプルがさらにある場合は、それらすべてを逆伝播で使用することにより、より高い精度を達成できる可能性があります。

- **トレーニングサンプルの分散**：データセットにクラス内の大きな分散が含まれている場合、逆伝播はより効果的です。つまり、特定のクラス内の画像が、角度やサイズなど、大幅に異なる方法で被写体を示している場合、逆伝播はおそらくより適切に機能します。しかし、そのような分散が低い環境でアプリケーションが動作し、トレーニングサンプルもクラス内の分散がほとんどない場合、ウェイトインプリンティングは非常にうまく機能します。

- **新しいクラスの追加**：トレーニングを開始した後、モデルに新しいクラスを追加できるのは、重みのインプリントのみです。バックプロパゲーションを使用している場合、トレーニングを開始した後に新しいクラスを追加するには、すべてのクラスのトレーニングを再開する必要があります。さらに、重みのインプリンティングにより、事前にトレーニングされたモデル（Edge TPU用にモデルを変換する前にトレーニングされたモデル）のクラスを保持できます。一方、逆伝播では、すべてのクラスをデバイス上で学習する必要があります。

- **モデルの互換性**：バックプロパゲーションは、「追加設定なしで」より多くのモデルアーキテクチャと互換性があります。既存の事前トレーニング済みのMobileNetおよびInceptionモデルを、デバイス上の逆伝播と互換性のある埋め込み抽出に変換できます。ウェイトインプリンティングを使用するには、非常に特定のレイヤーを持つモデルを使用し、特定の方法でトレーニングしてから、デバイス上のトレーニングに使用する必要があります（現在、適切な修正を加えたバージョンのMobileNet v1を提供しています）。

どちらの場合も、トレーニングプロセスの大部分はEdge TPUによって加速されます。また、再トレーニングされたモデルで推論を実行する場合、Edge TPUはCPUで実行される最終分類レイヤーを除くすべてを高速化します。ただし、この最後のレイヤーはモデルのごく一部しか占めていないため、CPUでこの最後のレイヤーを実行しても、推論速度に大きな影響はありません。

![unnamed-_3_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/934439f4-f736-0edf-db1f-f485f6b7bd2a.jpeg)


[ここでGoogle EDGE tpuを取得します](https://store.gravitylink.com/global)