MRが楽しい

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

Unity AIのドキュメントを読む その64(テンソルの作成と変更)

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

Unity AI

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

テンソルの作成と変更

推論エンジンのテンソルメソッドはNumPy、TensorFlow、PyTorchなどのフレームワークにあるメソッドに似ています。

テンソルの作成

Tensor APIのメソッドを使用して基本的なテンソルを作成できます。

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の3Dテンソルシェイプを作成する
        TensorShape shape = new TensorShape(3, 1, 3);

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

テンソルの値の取得と設定

テンソルデータのバックエンドタイプがBackendType.CPUで計算が完了している場合、値を直接設定および取得できます。

var tensor = new Tensor<float>(new TensorShape(1, 2, 3));
tensor[0, 1, 2] = 5.2f; // set value at index 0 of dim0 = 1, index 1 of dim1 = 2 and index 2 of dim2 = 3

float value = tensor[0, 1, 2];
Assert.AreEqual(5.2f, value);

テンソルの形状を変更する

テンソルを直接形状変更することができます。

var tensor = new Tensor<float>(new TensorShape(10));
tensor.Reshape(new TensorShape(2, 5));

テンソルの新しいシェイプはバックエンドに割り当てられたデータに収まる必要があります。
テンソルシェイプのlengthプロパティとテンソルデータのmaxCapacityプロパティを使用して要素数を確認できます。

var tensor = new Tensor<float>(new TensorShape(10));
Assert.AreEqual(10, tensor.count);
Assert.AreEqual(10, tensor.dataOnBackend.maxCapacity);

// テンソルをより小さな形状に変形する

tensor.Reshape(new TensorShape(2, 3));
Assert.AreEqual(6, tensor.count);
Assert.AreEqual(10, tensor.dataOnBackend.maxCapacity);
// 基礎となるdataOnBackendにはまだ10個の要素が含まれています

// dataOnBackend.maxCapacit に合わせて形状を変更する
tensor.Reshape(new TensorShape(1, 10));

テンソルの形状を変更する場合、推論エンジンは基礎となるdataOnBackendのデータや容量を変更しません。

Note

BackendType.GPUPixelを使用する場合、GPUテクスチャは線形に保存されないため、GPU上でテンソルの形状を変更することはできません。

テンソルの値をダウンロードする

次のようにブロッキングダウンロードを実行してテンソルデータのコピーをNativeArrayまたはArrayに取得できます。

var nativeArray = tensor.DownloadToNativeArray();
var array = tensor.DownloadToArray();

このダウンロードはブロッキング呼び出しです。
ReadbackRequestが呼び出されていないまたはIsReadbackRequestDoneがfalseの場合、強制的に待機状態になります。

Note

これらのメソッドはテンソルデータのコピーを返します。
ダウンロードした配列に変更を加えても元のテンソルには影響しません。