2016-05-02 45 views
9

Ho problemi con la preparazione dei dati di input per RNN su Keras.Keras: come devo preparare i dati di input per RNN?

Attualmente, la mia dimensione dei dati formazione è: (6752, 600, 13)

  • 6752: numero di dati di allenamento
  • 600: numero di tempo passi
  • 13: dimensioni di vettori di feature (il vettore è in float)

X_train e Y_train sono entrambi in questa dimensione.

Desidero preparare questi dati da alimentare in SimpleRNN su Keras. Supponiamo che stiamo attraversando fasi temporali, dal passaggio n. 0 al passo n. 599. Diciamo che voglio usare input_length = 5, il che significa che voglio usare i recenti 5 ingressi. (ad esempio, passo n. 10, n. 11, n. 12, n. 13, n. 14, n. 14).

Come dovrei rimodellare X_train?

dovrebbe essere o dovrebbe essere (6752, 600, 5, 13)?

E quale forma deve essere Y_train?

Dovrebbe essere (6752, 600, 13) o (6752, 1, 600, 13) o (6752, 600, 1, 13)?

risposta

12

Se si desidera solo prevedere l'output utilizzando i 5 ingressi più recenti, non è necessario fornire mai i 600 passaggi temporali completi di qualsiasi campione di allenamento. Il mio suggerimento sarebbe quello di passare i dati di addestramento nel modo seguente:

   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          ----------| 

Il numero totale di sequenze di addestramento riassumerà a

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

Ogni sequenza di training consiste di 5 fasi temporali. Ad ogni passo di ogni sequenza si passano tutti i 13 elementi del vettore di feature. Successivamente, la forma dei dati di addestramento sarà (4024192, 5, 13).

Questo ciclo può rimodellare i tuoi dati:

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

Grazie mille @Lorrit, che ha aiutato molto! Ora il mio modello è in esecuzione! – totuta