问题描述
我正在使用 Windows-Machine-Learning 将我的 VideoFrame
转换为 TensorFloat
_input
(形状:1,3,256,192;RGB 通道 + 图像),将其加载到我的 onnx 模型中并接收作为 _output
另一个 TensorFloat
对象(形状:1,17,64,48;17 个检测到的对象 + 图像)。
现在我的问题是:如果我想访问那个 TensorFloat
_output
,目前我知道的唯一方法是使用 _output.data.GetAsvectorView
,它给了我一个很长的 1d Vector 并尝试重新排序并弄清楚其中的尺寸是如何排序的?是否有一个明确的规则可以让我理解 4D 张量是如何在 1D Vector 中编码的?或者,我能否以某种方式直接从 _output
TensorFloat
对象访问不同的维度,因为使用“Shape”显示它是一个多维数组?
解决方法
请在此处参考 Windows ML 张量的布局:
https://docs.microsoft.com/en-us/uwp/api/windows.ai.machinelearning.tensorfloat?view=winrt-20348
张量是值的多维数组。浮点张量是 32 位浮点值的张量。
张量的布局是以行为主,用紧密包装的连续数据表示每个维度。张量的总大小是每个维度大小的乘积。
考虑:
Shape: [D1][D2][D3]...[DN]
Strides: [S1][S2][S3]...[SN]
Location: [A1][A2][A3]...[AN],
并且您希望计算 Location 处的索引。
然后,您可以假设:
Sn = Dn+1 * Dn+2 * ... * Dn,(for n = 1...N-1)
SN = 1
所以:
index = A1*S1 + A2*S2 + A3*S3 + ... + AN*SN