如何在 Core ML 的 MLMultiArray 中设置正确的步幅?跨步的价值观是什么意思?

问题描述 投票:0回答:1

如何在Core ML中的

strides
中设置正确的
MLMultiArray
?每个
strides
' 值的含义是什么?

例如,假设Core ML模型输入

shape
(1, 3, 1280, 720)
,那么在使用
strides
创建
MLMultiArray
对象时如何设置
initWithDataPointer:shape:dataType:strides:deallocator:error:
呢?

我在一些网站上将

strides
设置为
(720 * 1280, 720 * 1280, 720, 1)
,但我不知道为什么要这样设置,也不知道这样设置是否正确。
shape
strides
之间有什么联系。 Apple 开发者网站上没有更多有关它的文档。

ios machine-learning deep-learning coreml stride
1个回答
0
投票

Stride 的意思是“对于给定的维度,在展平的一维数组中要增加多少个样本,以便使维度增加 1”。

例如,对于形状为

x
的给定张量
(1, 3, 1280, 720)
,MLMultiArray 通常采用浮点指针,该指针指向大小为
(1 * 3  * 1280 * 720) = 2,764,800
的一维浮点数组。为了便于解释,我们将这个底层一维浮点数组称为
x_1d

通过行主序,我们可以观察到

x[0, 0, 0, 0]
对应于
x_1d[0]
x[0, 0, 0, 1]
对应于
x_1d[1]
。因此,最后一个维度的“步幅”始终为 1。

从那里,我们可以推断出

  • x[0, 0, 1, 0]
    对应于
    x_1d[720]
    ;
  • x[0, 1, 0, 0]
    对应于
    x_1d[1280 * 720]
    ;
  • x[1, 0, 0, 0]
    对应于
    x_1d[3 * 1280 * 720]
    ;

因此每个维度的步幅应该是

(3 * 1280 * 720, 1280 * 720, 720, 1)

您还可以通过使用

initWithShape
观察步幅来验证这一点:

NSArray<NSNumber *> *shape = @[@(1), @(3), @(1280), @(720)];
MLMultiArray *inputArray = [[MLMultiArray alloc] initWithShape:shape dataType:MLMultiArrayDataTypeDouble error:&error];

// print strides
NSArray<NSNumber *> *strides = inputArray.strides;
for (int i = 0; i < strides.count; i++) {
   NSLog(@"strides[%d]: %d", i, strides[i].intValue);
}

另请参阅 Microsoft Xamarin 的参考文档

© www.soinside.com 2019 - 2024. All rights reserved.