2016-03-21 33 views
8

che sto cercando di eseguire questo SimpleRNN:Numero errato di dimensioni su model.fit

model.add(SimpleRNN(init='uniform',output_dim=1,input_dim=len(pred_frame.columns))) 
model.compile(loss="mse", optimizer="sgd") 
model.fit(X=predictor_train, y=target_train, batch_size=len(pred_frame.index),show_accuracy=True) 

L'errore è il model.fit, come potete vedere qui sotto:

File "/Users/file.py", line 1496, in Pred 
model.fit(X=predictor_train, y=target_train, batch_size=len(pred_frame.index),show_accuracy=True) 
File "/Library/Python/2.7/site-packages/keras/models.py", line 581, in fit 
shuffle=shuffle, metrics=metrics) 
File "/Library/Python/2.7/site-packages/keras/models.py", line 239, in _fit 
outs = f(ins_batch) 
File "/Library/Python/2.7/site-packages/keras/backend/theano_backend.py", line 365, in __call__ 
return self.function(*inputs) 
File "/Library/Python/2.7/site-packages/theano/compile/function_module.py", line 513, in __call__ 
allow_downcast=s.allow_downcast) 
File "/Library/Python/2.7/site-packages/theano/tensor/type.py", line 169, in filter 
data.shape)) 
TypeError: ('Bad input argument to theano function with name "/Library/Python/2.7/site-packages/keras/backend/theano_backend.py:362" at index 0(0-based)', 'Wrong number of dimensions: expected 3, got 2 with shape (88, 88).') 

L'errore mi sta dicendo che ha il numero sbagliato di dimensioni, dovrebbe essere 3 e ha solo 2. Quali sono le dimensioni a cui si riferisce?

risposta

8

Si sta tentando di eseguire un RNN. Ciò significa che si desidera che includa i passaggi temporali precedenti nel calcolo. Per fare ciò, è necessario pre-elaborare i dati prima di darli al livello SimpleRNN.

Per semplicità, supponiamo che invece di 88 campioni con 88 caratteristiche ciascuno di essi abbiate 8 campioni con 4 caratteristiche ciascuno. Ora, quando si utilizza un RNN, si dovrà decidere un massimo per il backpropagation (cioè il numero di passi temporali precedenti inclusi nel calcolo). In questo caso, puoi scegliere di includere un massimo di 2 passaggi temporali precedenti. Pertanto, per il calcolo dei pesi del RNN dovrai fornire ad ogni passo temporale l'input del passo temporale corrente (con le sue 4 caratteristiche) e l'input dei 2 passi temporali precedenti (con 4 caratteristiche ciascuno). Proprio come in questa visualizzazione:

sequence sample0 sample1 sample2 sample3 sample4 sample5 sample6 sample7  
    0  |-----------------------| 
    1     |-----------------------| 
    2       |-----------------------| 
    3         |-----------------------| 
    4            |----------------------| 
    5              |----------------------| 

Così, invece di dare un (nb_samples, nb_features) della matrice come input per il SimpleRNN, si dovrà dare un (nb_sequences, nb_timesteps, nb_features) Ingresso forma. In questo esempio, significa che invece di dare un input (8x4) gli dai un input (5x3x4).

I keras Embedding strato potrebbe fare questo lavoro, ma in questo caso è anche possibile scrivere un codice breve per esso:

input = np.random.rand(8,4) 
nb_timesteps = 3 # 2 (previous) + 1 (current) 
nb_sequences = input.shape[0] - nb_timesteps #8-3=5 

input_3D = np.array([input[i:i+nb_timesteps] for i in range(nb_sequences)]) 
+0

Grazie per la spiegazione, ho un problema simile. Perché i passaggi massimi per il backpropagation nel caso in cui si sta commentando sono solo 2? E perché il numero di sequenze è 5? A proposito, con sequenza intendi un'epoca nell'allenamento? – David

+1

Ho scelto a caso il numero 2 come la quantità di passaggi precedenti per il backpropagation per questo esempio. In combinazione con il numero (anche liberamente scelto) di 8 campioni, questo porta a un totale di 5 sequenze. La sequenza 1 include il campione 1, 2 e 3, la sequenza 2 include 2, 3 e 4 e così via. Vedi la visualizzazione nella mia risposta per i dettagli. Un'epoca è fatta quando la rete è stata addestrata con ciascuna sequenza una volta. Quindi inizi di nuovo con la prima sequenza – Lorrit

4

L'errore è probabilmente perché i tuoi dimensioni di ingresso non sono nel formato:

(nb_samples, timesteps, input_dim) 

Si aspetta 3 dimensioni, e si sta fornendo solo 2 di loro (88,88).

+0

eccezionale @Tarantula! Input dim è il numero di colonne del mio dataframe predittore, giusto? Cos'è timesteps e nb_samples? Righe e dimensioni del telaio? – abutremutante