Преобразование MLMultiArray в [Double] вызывает NaN - PullRequest
0 голосов
/ 14 июля 2020

Я конвертирую возвращение prediction() в CoreML (4 b1) из MLMultiArray в [Double], и ​​результатом является создание NaN, что, как правило, не имеет для меня никакого смысла. Что может происходить?

Вот функция преобразования, которую я использую:

static func toDoubleArray(_ o: MLMultiArray) -> [Double] {
        let length = o.count
        let doublePtr =  o.dataPointer.bindMemory(to: Double.self, capacity: length)
        let doubleBuffer = UnsafeBufferPointer(start: doublePtr, count: length)
        let output = Array(doubleBuffer)
        return output
    }

А вот пример вывода с таинственными NaN:

original:
zn: Float32 1 x 30 matrix
[1.082742,-0.6218173,0.4097924,0.7741141,0.3768867,0.1923163,-0.6453421,-1.51211,0.9758957,-0.01491163,0.3188823,0.6816303,-0.3234658,-0.1413545,-0.3082153,-0.3349644,0.6796142,0.0495025,1.436066,-1.348089,0.2413646,-0.931259,-0.1012118,0.849587,-0.1338869,-0.5497701,-0.5438929,1.653574,-0.6829579,-0.539122]

converted: [-0.0001189622124778386, 0.0006766730199516765, 9.747163042077938e-09, -0.13711044152516036, -1.7618037121610124e-17, 0.00023267642183680645, -9.748075633049926e-10, -8.196165002097733e-07, 1.901572700078848e-13, -0.05577234175498982, -0.003711220331500651, 0.0015560479289331661, -5.481938547240449e-05, 0.3071476808226601, -4.9620131810906736e-05, 3.793063e-317, 2.220121165e-314, 1.5e-323, -nan(0x3ffff89abcdef), 5.312137469e-314, 0.0, 0.0, 0.0, 4.4490612551694285e-308, 7.99e-321, 2.2200499266e-314, 5e-324, 5.417665788e-314, 0.0, 0.0]

Похоже, я просто откуда-то получаю мусорную память ... но опять же, она не должна содержать NaN. Очень запутано.

ОБНОВЛЕНИЕ: Итак, как заметил Матти js, основная память - это Float32. Если мне просто нужен MLMultiArray, содержащий Doubles в виде массива Swift, тогда функция toDoubleArray() подойдет. Но в моем случае я хочу как преобразование в Double , так и a Swift Array. Эта версия обеспечивает это и, похоже, дает ожидаемый результат:

static func castToDoubleArray(_ o: MLMultiArray) -> [Double] {
        var result: [Double] = Array(repeating: 0.0, count: o.count)
        for i in 0 ..< o.count {
            result[i] = o[i].doubleValue
        }
        return result
    }

1 Ответ

1 голос
/ 14 июля 2020

Исходным является массив значений Float32, поэтому вы должны преобразовать его в массив Float, а не Double.

...