2017-03-22 3 views
2

J'ai un modèle de réseau formé à l'aide de la formation par lots. Une fois qu'il est formé, je veux prédire la sortie pour un seul exemple.Utilisation de Keras LSTM pour prédire un seul exemple après l'utilisation de l'apprentissage par lots

Voici mon code modèle:

model = Sequential() 
model.add(Dense(32, batch_input_shape=(5, 1, 1))) 
model.add(LSTM(16, stateful=True)) 
model.add(Dense(1, activation='linear')) 
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy']) 

J'ai une séquence d'entrées simples à sorties simples. Je fais un code de test pour mapper les caractères aux caractères suivants (A-> B, B-> C, etc.).

I créer des données d'entrée de forme (15,1,1) et une donnée de sortie de forme (15, 1) et appeler la fonction:

model.fit(x, y, nb_epoch=epochs, batch_size=5, shuffle=False, verbose=0) 

Les trains miniatures, et maintenant je veux prendre un seul caractère et prédire le caractère suivant (entrée A, il prédit B). Je crée une entrée de forme (1, 1, 1) et appelle:

pred = model.predict(x, batch_size=1, verbose=0) 

Cela donne:

ValueError: Shape mismatch: x has 5 rows but z has 1 rows 

j'ai vu une solution était d'ajouter "données factices" à votre prédire les valeurs, donc la forme d'entrée pour la prédiction serait (5,1,1) avec les données [x 0 0 0 0] et vous prendriez simplement le premier élément de la sortie comme valeur. Cependant, cela semble inefficace quand il s'agit de gros lots.

J'ai aussi essayé d'enlever la taille du lot de la création de modèle, mais je reçu le message suivant:

ValueError: If a RNN is stateful, a complete input_shape must be provided (including batch size). 

Y at-il une autre façon? Merci pour l'aide.

Répondre

0

Actuellement (Keras v2.0.8) il faut un peu plus d'efforts pour obtenir des prédictions sur des rangées uniques après une formation en batch.

Fondamentalement, la taille de lot est fixée au moment de la formation, et doit être la même au moment de la prédiction.

La solution est en ce moment à prendre les poids du modèle formé, et les utiliser comme poids dans un nouveau modèle que vous venez de créer, qui a une batch_size 1.

Le code rapide pour que est

model = create_model(batch_size=64) 
mode.fit(X, y) 
weights = model.get_weights() 
single_item_model = create_model(batch_size=1) 
single_item_model.set_weights(weights) 
single_item_model.compile(compile_params) 

Voici un blog qui va plus en profondeur: https://machinelearningmastery.com/use-different-batch-sizes-training-predicting-python-keras/

Je l'ai utilisé cette approche dans le passé pour avoir plusieurs modèles à la prévision d'un de temps qui fait des prédictions sur le grand lot es, qui fait des prédictions sur de petits lots, et qui fait des prédictions sur des objets uniques. Puisque les prédictions par lots sont beaucoup plus efficaces, cela nous donne la flexibilité de prendre n'importe quel nombre de lignes de prédiction (pas seulement un nombre divisible par batch_size), tout en obtenant des prédictions assez rapidement.