MRが楽しい

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

Unity AIのドキュメントを読む その54(モデルの入力を作成する)

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

Unity AI

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

モデルの入力を作成する

モデルには特定の形状とデータ型を持つ入力テンソルが必要です。
この情報を使用してモデルの入力を見つけ、入力テンソルを作成します。

必要な入力を理解する

モデルの入力テンソルを作成する前に、モデルを調べてモデル入力の形状とデータ型を理解する必要があります。
作成するテンソルのTensorShapeは、モデル入力の形状を定義するDynamicTensorShapeと互換性がある必要があります。

配列をテンソルに変換する

1次元データ配列から中央処理装置(CPU)テンソルを作成するには以下の手順に従います。

  1. 各軸の長さを持つTensorShapeオブジェクトを作成します。
  2. 形状とデータ配列を持つTensorオブジェクトを作成します。

以下のコードは形状 3×1×3の 入力テンソルを受け取るモデルのテンソルを作成する一例です。

using UnityEngine;
using Unity.InferenceEngine;

public class ConvertArrayToTensor : MonoBehaviour
{
    void Start()
    {
        // 9つの値を持つデータ配列を作成する
        float[] data = new float[] { 1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f, 9f };

        // 3 × 1 × 3 のサイズを持つ3次元テンソルの形状を作成する
        TensorShape shape = new TensorShape(3, 1, 3);

        // 配列から新しいテンソルを作成する
        Tensor<float> tensor = new Tensor<float>(shape, data);

        // テンソルの内容をコンソールに出力する
        Debug.Log("Tensor contents:");
        for (int i = 0; i < tensor.count; i++)
        {
            Debug.Log(tensor[i]);
        }
    }
}


空のテンソルを作成する

ゼロ初期化されたメモリを持つ中央処理装置(CPU)テンソルは次のように作成できます。

var tensor = new Tensor<int>(new TensorShape(1), clearOnInit: true);

clearOnInitパラメータは結果のテンソルメモリをゼロ初期化するかどうかを決定します。
初期データが重要でない場合はclearOnInitをfalseに設定します。

ワーカーに入力を渡す

モデルに複数の入力テンソルが必要な場合は以下のいずれかを実行します。

  • ワーカーで各入力に対してSetInputを呼び出し、次にワーカーで引数なしでScheduleを呼び出します。
  • ワーカーで必要な入力の配列を指定してScheduleを呼び出します。
worker.SetInput("x", xTensor);
worker.SetInput("y", yTensor);
worker.Schedule();
worker.Schedule(xTensor, yTensor);

パラメータ配列の作成によるガベージコレクションを回避するには入力配列を事前に割り当てることができます。

var inputs = new [] { xTensor, yTensor };
//...
worker.Schedule(inputs);

モデルを編集する

Functional APIを使用してモデルの入力に操作を追加します。