[Unity Sentis] Sentis 中的 Tensor 基本原理

英文原文:https://docs.unity3d.com/Packages/[email protected]/manual/tensor-fundamentals.html

在 Sentis 中,您可以在称为张量的多维数组中输入和输出数据。 Sentis 中的张量的工作方式与 TensorFlow、PyTorch 和其他机器学习框架中的张量类似。

Sentis 中的张量最多可以有 8 个维度。如果张量的维度为零,则该张量包含单个值,称为标量。

您可以创建以下类型的张量:

  • TensorFloat,将数据存储为浮点数。
  • TensorInt,将数据存储为整数。

有关详细信息,请参阅创建和修改张量。

内存布局

Sentis 按行优先顺序将张量存储在内存中。这意味着张量最后一维的值在内存中是相邻的。

例如,对于值为 0 到 11 的 2 × 2 × 3 张量:

[Unity Sentis] Sentis 中的 Tensor 基本原理_第1张图片
值为 0 到 11 的 2 × 2 × 3 张量,以及 Sentis 如何在内存中存储该张量。

格式

模型通常需要某种格式的输入张量。例如,处理图像的模型可能需要以下格式之一的 3 通道 240 × 240 图像:

  • 1 × 240 × 240 × 3,其中维度的顺序是批量大小、高度、宽度、通道(NHWC)
  • 1 × 3 × 240 × 240,其中维度的顺序是批量大小、通道、高度、宽度(NCHW)

如果您的张量与模型所需的格式不匹配,您可能会得到意外的结果。

您可以使用 Ops.Transpose 将张量转换为其他格式。有关详细信息,请参阅创建和修改张量。

如果您需要将纹理转换为特定格式的张量,请参阅为模型创建输入以获取更多信息。

内存位置

Sentis 将张量数据存储在 GPU 内存或 CPU 内存中。

Sentis 通常将张量存储在与您使用的后端类型相匹配的内存中。例如,如果您使用 BackendType.GPUCompute 后端类型,Sentis 通常将张量存储在 GPU 内存中。

如果张量位于 CPU 上,则只能直接读取和写入张量的元素,而且速度可能很慢。如果您使用 Ops API 中的优化方法,速度会更快。

如果需要直接读取和写入张量的元素,请使用 Tensor.MakeReadable()。 Sentis 执行张量到 CPU 的阻塞读回。下次您在 GPU 上的模型或操作中使用此张量时,将会自动阻止上传。

为了避免 Sentis 执行阻塞读回和上传,您还可以使用计算着色器、Burst 或本机数组直接在内存中读取和写入张量数据。有关更多信息,请参阅直接访问张量数据。

当您需要读取输出张量时,您还可以执行异步读回,因此 Sentis 在等待模型完成然后下载整个张量时不会阻塞主代码线程。有关详细信息,请参阅异步读取模型的输出。

你可能感兴趣的:(Unity,人工智能,unity,人工智能)