2016-05-02 2 views
9

J'ai des problèmes avec la préparation des données d'entrée pour RNN sur Keras.Keras: Comment dois-je préparer les données d'entrée pour RNN?

Actuellement, ma dimension de données de formation est: (6752, 600, 13)

  • 6752: nombre de données de formation
  • 600: nombre de pas de temps
  • 13: la taille des vecteurs de caractéristiques (le vecteur est flottant)

X_train et Y_train sont tous deux dans cette dimension.

Je veux préparer ces données pour être introduit dans SimpleRNN sur Keras. Supposons que nous passons par des pas de temps, de l'étape 0 à l'étape 599. Disons que je veux utiliser input_length = 5, ce qui signifie que je veux utiliser 5 entrées récentes. (par exemple, étapes n ° 10, n ° 11, n ° 12, n ° 13, n ° 14 à l'étape n ° 14).

Comment est-ce que je devrais remodeler X_train?

devrait-il être (6752, 5, 600, 13) ou devrait-il être (6752, 600, 5, 13)?

Et quelle forme devrait être Y_train?

Devrait-il être (6752, 600, 13) ou (6752, 1, 600, 13) ou (6752, 600, 1, 13)?

Répondre

12

Si vous voulez seulement prédire la sortie en utilisant les 5 entrées les plus récentes, il n'est pas nécessaire de fournir les 600 pas de temps de tout échantillon d'apprentissage. Ma suggestion serait de transmettre les données de formation de la manière suivante:

   t=0 t=1 t=2 t=3 t=4 t=5 ... t=598 t=599 
sample0  |---------------------| 
sample0   |---------------------| 
sample0    |----------------- 
... 
sample0           ----| 
sample0           ----------| 
sample1  |---------------------| 
sample1   |---------------------| 
sample1    |----------------- 
.... 
.... 
sample6751          ----| 
sample6751          ----------| 

Le nombre total de séquences de formation résumera à

(600 - 4) * 6752 = 4024192 # (nb_timesteps - discarded_tailing_timesteps) * nb_samples 

Chaque séquence de formation se compose de 5 étapes de temps. À chaque pas de temps de chaque séquence, vous passez tous les 13 éléments du vecteur de caractéristiques. Par la suite, la forme des données d'apprentissage sera (4024192, 5, 13).

Cette boucle peut remodeler vos données:

input = np.random.rand(6752,600,13) 
nb_timesteps = 5 

flag = 0 

for sample in range(input.shape[0]): 
    tmp = np.array([input[sample,i:i+nb_timesteps,:] for i in range(input.shape[1] - nb_timesteps + 1)]) 

    if flag==0: 
     new_input = tmp 
     flag = 1 

    else: 
     new_input = np.concatenate((new_input,tmp)) 
+1

Merci beaucoup @Lorrit, Cela m'a beaucoup aidé! Maintenant, mon modèle est en cours d'exécution! – totuta