2017-06-10 2 views
2

Mon modèle keras avec la forme d'entrée (none, 40 [pas de temps], 12 [caractéristiques]) ressemble à ceci:Comment formater des données d'entrée pour un conv1d/LSTM nn coreml converti de keras

model = Sequential([ 
    Conv1D(nodes_per_layer, filter_length, subsample_length=2, activation='relu', input_shape=(timesteps, data_dim), name='accelerations'), 
    Conv1D(nodes_per_layer, filter_length, subsample_length=1, activation='relu'), 
    LSTM(nodes_per_layer, return_sequences=True), 
    LSTM(nodes_per_layer, return_sequences=False), 
    Dropout(dropout), 
    Dense(num_classes), 
    Activation('softmax', name='scores'), 
]) 

Après convertir en .mlmodel, je l'ajoute à ma XCodeProject: enter image description here

Je puis essayer de faire l'inférence et obtenir des scores de prédiction:

func makePredictionRequest(currentScaledMotionArrays: [[Double]]) { 
    let data = _currentScaledMotionArrays.reduce([], +) //result is of type [Double] with 480 elements 
    do { 
     let mlMultiArray = try MLMultiArray(shape:[40,12], dataType:MLMultiArrayDataType.double) 
     for (index, element) in data.enumerated() { 
      mlMultiArray[index] = NSNumber(value: element) 
     } 
     let input = PredictionModelInput(accelerations: mlMultiArray) 
     let predictionOutput = try _predictionModel.prediction(input: input) 
    } 
    catch { 
     print(error.localizedDescription) 
    } 
} 

Mais la predictionModel.prediction (entrée: input) échoue toujours et renvoie l'erreur suivante:

"Le modèle s'attend à ce que la fonction d'entrée lstm_1_h_in soit un tableau, mais l'entrée est de type 0."

Les états masqués des couches lstm doivent donc être initialisés. Je ne sais pas si ce comportement est attendu, puisque je n'ai jamais rencontré le même problème auparavant. Ni en faisant inférence dans keras lui-même ou avec google cloud ml. Je ne connais pas non plus les valeurs initiales, qui sont habituellement choisies pour l'inférence. Peut-être juste des tableaux de zéros? Quelqu'un at-il fait face à un problème similaire? Le fichier .mlmodel a été trouvé here.

+0

Quel est le message d'erreur réelle? –

+0

Stupide moi, je viens de copier le code de la documentation Apple sans vraiment rattraper l'erreur. J'ai changé ma question en conséquence. – Lausbert

Répondre

2

J'ai réellement réalisé ce que je voulais faire.

L'extrait suivant travaille pour rapides 4.0, keras 2.0.4 et coremltools 0.4.0. La forme d'entrée keras est (aucune, 40 [timesteps], 12 [features]). Notez l'ordre de paramètre modifié (40 [timesteps], none, 12 [features]) ci-dessous.

Les statistiques cachées des 32 nœuds des deux couches lstm sont initialisées avec des zéros. Je dois tester si cela conduira au comportement attendu ou si je dois les initialiser aléatoirement.

func makePredictionRequest(evaluationStep: EvaluationStep) { 
     let data = _currentScaledMotionArrays.reduce([], +) //result is of type [Double] with 480 elements 
     do { 
      let accelerationsMultiArray = try MLMultiArray(shape:[40,1,12], dataType:MLMultiArrayDataType.double) 
      for (index, element) in data.enumerated() { 
       accelerationsMultiArray[index] = NSNumber(value: element) 
      } 
      let hiddenStatesMultiArray = try MLMultiArray(shape: [32], dataType: MLMultiArrayDataType.double) 
      for index in 0..<32 { 
       hiddenStatesMultiArray[index] = NSNumber(integerLiteral: 0) 
      } 
      let input = PredictionModelInput(accelerations: accelerationsMultiArray, lstm_1_h_in: hiddenStatesMultiArray, lstm_1_c_in: hiddenStatesMultiArray, lstm_2_h_in: hiddenStatesMultiArray, lstm_2_c_in: hiddenStatesMultiArray) 
      let predictionOutput = try _predictionModel.prediction(input: input) 
      print(predictionOutput.scores) 
     } 
     catch { 
      print(error.localizedDescription) 
     } 
    } 

Vous pouvez aussi voir mon full implementation.

Et si ma réponse a résolu votre problème, il suffit de me laisser une légère hausse ici :)

+1

Comment l'initialisation "zéro" a-t-elle affecté vos sorties? – Narsail

+0

La classification fonctionne comme prévu (le .gif sur ma [page d'accueil des projets] (https://github.com/Lausbert/Exermote) montre réellement cela en cours d'utilisation) et similaire à ma mise en œuvre sur google cloud ml, où je didn ' Je dois initialiser quoi que ce soit. J'ai le sentiment que l'initialisation n'a pas vraiment d'importance tant que votre séquence est assez longue. Mais je n'ai pas testé l'initialisation aléatoire jusqu'à présent. – Lausbert