MRが楽しい

MRやVRについて学習したことを書き残す

Unity AIのドキュメントを読む その50(モデルを編集する)

本日はUnityの技術調査枠です。
Unity AIのドキュメントを読みながら実際に操作を試して記事に残します。

Unity AI

以下のUnity AIのドキュメントを試しながら実行時のキャプチャをしていきます。
docs.unity3d.com

モデルを編集する

モデルを作成またはロードした後、推論エンジンのFunctional APIを使用してモデルを編集します。

入力の前処理または出力の後処理

モデルがテンソルデータと一致しない形式の入力を期待したり、出力を返したりする場合はFunctional APIを使用して調整します。
以下のタスクを実行できます。

  • モデル入力に演算を追加する
  • モデル出力に演算を追加する
  • 入力と出力を追加または削除する

例えば、次のコードはmnist-8モデルを変更して出力にソフトマックス演算を適用します。

using UnityEngine;
using Unity.InferenceEngine;

public class AddOutput : MonoBehaviour
{
    [SerializeField]
    ModelAsset modelAsset;

    void Start()
    {
        // モデルアセットからソースモデルを読み込みます。
        Model model = ModelLoader.Load(modelAsset);

        // モデルの関数グラフを定義します。
        var graph = new FunctionalGraph();

        // 元のモデル入力からグラフの入力を設定し、関数テンソルの配列を返します。
        // グラフの入力名は、モデルの入力名から取得されます。
        var inputs = graph.AddInputs(model);

        // 入力にモデル forward 関数を適用して、ソースモデルの関数出力を取得します。
        // 推論エンジンは、読み込まれたソースモデルを破壊的に変更します。
        // これを回避するにはメモリ使用量とコンパイル時間の増加を犠牲にして、
        // Functional.ForwardWithCopy メソッドを使用します。
        FunctionalTensor[] outputs = Functional.Forward(model, inputs);

        // 関数APIを使用して、最初の出力のソフトマックスを計算します。
        FunctionalTensor softmaxOutput = Functional.Softmax(outputs[0]);

        // 出力に名前を付けてグラフに追加します。
        graph.AddOutput(softmaxOutput, "softmax");

        // Compileメソッドを使用して、グラフからモデルを構築します。
        var modelWithSoftmax = graph.Compile();
    }
}

推論エンジンはFunctional APIを使用して作成したモデルに対してモデル最適化を実行します。
そのため、推論中に使用される演算は想定したものと異なる場合があります。

Tips

コンパイルは大量のメモリを必要とする低速な操作です。
オフラインで実行し、計算済みモデルをシリアル化することをお勧めします。