2

J'essaie de former le modèle Keras LSTM pour prédire le nombre suivant dans une séquence.Modèle de Keras pour prédire la séquence des nombres

  1. Quel est le problème avec mon modèle ci-dessous, comment puis-je déboguer quand un modèle est pas l'apprentissage
  2. Comment puis-je décider quels types couche à utiliser
  3. Sur quelle base dois-je choisir params de perte et optimiseur tandis que compilation

Mes données de formation d'entrée est de forme (16000, 10) comme ci-dessous

[ 
    [14955 14956 14957 14958 14959 14960 14961 14962 14963 14964] 
    [14731 14732 14733 14734 14735 14736 14737 14738 14739 14740] 
    [35821 35822 35823 35824 35825 35826 35827 35828 35829 35830] 
    [12379 12380 12381 12382 12383 12384 12385 12386 12387 12388] 
    ... 
] 

corres ding données de formation de sortie est de forme (16000, 1) comme ci-dessous

[[14965] [14741] [35831] [12389] ...] 

Comme LSTM se plaint, je remodelés des données de formation/tests

X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1) 
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1) 

Voici la forme de données de formation/test final

Total Samples: 20000 
X_train: (16000, 10, 1) 
y_train: (16000, 1) 
X_test: (4000, 10, 1) 
y_test: (4000, 1) 

Voici mon modèle

# Model configuration 
epochs = 2 
batch_size = 32 
hidden_neurons = 100 
output_size = 1 

# Create the model 
model = Sequential() 
model.add(LSTM(hidden_neurons, input_shape=(X_train.shape[1], X_train.shape[2]))) 
model.add(Dense(output_size)) 
model.compile(loss='mean_squared_error', optimizer='rmsprop', metrics=['accuracy']) 
print(model.summary()) 
model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size) 

scores = model.evaluate(X_test, y_test, batch_size=batch_size, verbose=0) 
print("Model Accuracy: %.2f%%" % (scores[1]*100)) 

Voici ma sortie

_________________________________________________________________ 
Layer (type)     Output Shape    Param # 
================================================================= 
lstm_3 (LSTM)    (None, 100)    40800  
_________________________________________________________________ 
dense_3 (Dense)    (None, 1)     101  
================================================================= 
Total params: 40,901 
Trainable params: 40,901 
Non-trainable params: 0 
_________________________________________________________________ 
None 
Epoch 1/2 
16000/16000 [==============================] - 11s - loss: 533418575.3600 - acc: 0.0000e+00  
Epoch 2/2 
16000/16000 [==============================] - 10s - loss: 532474289.7280 - acc: 6.2500e-05  
Model Accuracy: 0.00% 
+0

l'avez-vous essayé avec plus de 2 époques? –

+0

Oui, j'ai essayé même 10 époques, mais la perte ne diminue pas beaucoup, la précision reste 0 – Mosu

+0

Cela ressemble à un problème de régression, dans ce cas la précision n'a aucun sens. –

Répondre

1

essayez ce code:

epochs = 30 
batch_size = 64 
hidden_neurons = 32 
output_size = 1 

# Create the model 
model = Sequential() 
model.add(LSTM(hidden_neurons, input_shape=(X_train.shape[1], X_train.shape[2]))) 
model.add(Dense(output_size, activation = 'elu')) 

model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy']) 
print(model.summary()) 
model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size) 

scores = model.evaluate(X_test, y_test, batch_size=batch_size, verbose=0) 
print("Model Accuracy: %.2f%%" % (scores[1]*100)) 

en général, il est vraiment difficile de vous aider, car nous avons besoin par exemple de type reproductible que nous pouvons tester. Cependant, voici mes conseils:

jouer avec les paramètres hyper de votre NN, tels que: fonctions d'activation, fonction d'opt, nombre de couches, taux d'apprentissage et ainsi de suite.

MISE À JOUR:

Il est fortement conseillé de normaliser d'abord vos données.

+0

Bonjour @Paddy, merci pour la réponse, j'ai couru même 50 époques sur votre code, et j'ai obtenu seulement 0.1% de précision. Pouvez-vous élaborer sur la normalisation des données et donner un exemple sur un ensemble de données comme le mien. – Mosu

+0

Bonjour @Paddy merci de souligner la normalisation. J'ai normalisé toutes les données pour être entre 0-1 en divisant les données d'entrée/sortie par max de input_data. Et les prédictions finales semblent être proches, mais pas parfaites. Faites-moi savoir si d'autres pensées peuvent aider à améliorer les prédictions. – Mosu

+0

il y a beaucoup de chose que vous pouvez essayer, Strart avec la normalisation des lots et l'abandon. Je voudrais aussi essayer GRU au lieu de LSTM (simplement remplacer LSTM avec GRU). En outre, il serait bon d'avoir un rappel de taux d'apprentissage vérifier ce lien: https://machinelearningmastery.com/using-learning-rate-schedules-deep-learning-models-python-keras/ – Paddy

0

La précision n'est pas la bonne mesure pour les performances de votre modèle. Ce que vous essayez de faire est ici plus d'un régression tâche qu'un classification tâche. La même chose peut être vu de votre fonction de perte, vous utilisez 'mean_squared_error' plutôt que quelque chose comme 'categorical_crossentropy'.

En outre, 50 époques est trop moins d'un temps d'entraînement. Si vous jetez un coup d'oeil aux journaux (dans votre question initiale), vous voyez la perte se réduire à chaque époque. Vous devrez continuer à vous entrainer avec plus d'époques jusqu'à ce que vous constatiez que la perte s'est stabilisée et ne diminue pas davantage. Troisièmement, vous devrez certainement normaliser vos données avant de passer à la fonction d'ajustement. Les valeurs sont très grandes et l'algorithme pourrait ne pas converger sans normalisation.

Si vous avez toujours besoin de résoudre ce problème, et si vous avez besoin de plus d'aide, faites-le moi savoir dans les commentaires, afin que je puisse vous aider avec le code.