如何在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 开发者网站上没有更多有关它的文档。
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 的参考文档。