Как инициализировать многомерный MLMultiArray

#swift #machine-learning #coreml #onnx #coremltools

Вопрос:

Я размещаю модель CoreML, которая принимает MLMultiArray в качестве входных данных значение 4 ранга:

введите описание изображения здесь

Мои входные данные следующие:

 let inputArray: [[[Float]]]
 

Но я не могу понять, как инициализировать MLMultiArray с его помощью. Вот несколько попыток:

 MLMultiArray(inputArray) // error: No exact matches in call to initializer
 
 let multiArray = try! MLMultiArray(shape: [0, 128, 128, 1], dataType: .float32)
multiArray[0,1] = inputArray[0] // Cannot assign value of type '[[Float]]' to subscript of type 'NSNumber'
 
 memset(multiArray.dataPointer, 0, 128*128) // EXC_BAD_ACCESS (code=1, address=0x0)
 

Как вы инициализируете такой MLMultiArray?

Ответ №1:

Инициализируя его как

 let input = try! MLMultiArray(shape: [1, 128, 128, 1], dataType: .float64)
 

правильно (обратите внимание, что я отредактировал форму ввода в coremltools).

Заполнение должно быть следующим:

 for batchIndex in 0..<inputArray.count {
    for heightIndex in 0..<inputArray[0].count {
        for widthIndex in 0..<inputArray[0][0].count {
            input[[batchIndex, heightIndex, widthIndex, 0] as [NSNumber]] = (inputArray[batchIndex][heightIndex][widthIndex]) as NSNumber
        }
    }
}