J'ai un modèle que j'ai formé avec Keras qui attend une entrée 4D, N étant le nombre d'échantillons, et chaque échantillon étant une donnée 3D sous la forme de (9,15,1) et ce ne sont PAS des images. J'ai converti le modèle Keras à l'aide de CoreML Converter et importé le modèle dans xcode comme indiqué ci-dessous

enter image description here

J'ai un tableau 4D Float qui représente mes données et j'ai du mal à l'alimenter dans mon modèle pour faire une prédiction avec.

Le modèle attend un MLMultiArray, et d'après ce que j'ai essayé, je ne peux ni simplement convertir mon tableau flottant 4D en MLMultiArray, ni le créer à partir de zéro.

Disons que j'ai des "données" qui sont un tableau 4D de Float

let data = [[[[Float]]]]()
let arr = try? MLMultiArray(data)  

Cela me donne

Initializer 'init(_:)' requires that '[[[[Float]]]]' conform to 'FixedWidthInteger'

J'ai trouvé un autre article sur https://itnext.io/train-your-own-ml-model-using-scikit-and-use-in-ios-app-with-coreml-and -probablement-avec-augmenté-99928a3757ad montrant comment construire le MLMultiArray pour un tableau 2D, cela fonctionne bien car vous savez que la première dimension est le nombre d'échantillons, vous devez donc vraiment ajouter les valeurs de la deuxième dimension en tant que NSNumber. Mais cela n'aide pas à expliquer ce qu'il faut faire avec la 3e ou la 4e dimension des données.

J'ai toujours essayé d'utiliser cette méthode pour définir chaque échantillon 3D un par un dans le MLMultiArray

var arr = try? MLMultiArray(shape: [NSNumber(value:9), NSNumber(value:15), NSNumber(value:1)], dataType: MLMultiArrayDataType.float32)

for (ind,sample) in data.enumerated() {
    let arr = try? MLMultiArray(sample)
    arr?[ind] = arr
}

Lorsque je lance cela, j'obtiens l'erreur suivante...

Cannot assign value of type 'MLMultiArray?' to type 'NSNumber'.

Il attend donc un NSNumber même s'il s'agit de 4D ?? Quelle est la bonne façon de créer un MLMultiArray à partir de vos données 4D Float à saisir dans un modèle CoreML ?

0
judopro 5 oct. 2020 à 05:35

1 réponse

Meilleure réponse

Si vous utilisez un tableau Float pour initialiser le MLMultiArray, il doit s'agir d'un tableau à 1 dimension. Cela signifie que vous devez d'abord "aplatir" vos données 4D dans un tableau 1D.

(C'est pourquoi MLMultiArray a une propriété strides. Vous devez utiliser ces foulées pour calculer la position de chaque élément dans le tableau aplati.)

1
Matthijs Hollemans 5 oct. 2020 à 10:01