2016-03-21 3 views
8

Je suis en train d'exécuter ce SimpleRNN:Mauvais nombre de dimensions sur 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'erreur est sur model.fit, comme vous pouvez le voir ci-dessous:

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'erreur me dit qu'il a le mauvais nombre de dimensions, il devrait être 3 et il n'en a que 2. Quelles sont les dimensions auxquelles il fait référence?

Répondre

8

Vous essayez d'exécuter un RNN. Cela signifie que vous voulez inclure les étapes de temps précédentes dans votre calcul. Pour ce faire, vous devez prétraiter vos données avant de les donner à la couche SimpleRNN. Pour simplifier, supposons qu'au lieu de 88 échantillons avec 88 caractéristiques chacun, vous avez 8 échantillons avec 4 caractéristiques chacun. Maintenant, lorsque vous utilisez un RNN, vous devrez décider d'un maximum pour la rétropropagation (c'est-à-dire le nombre d'étapes de temps précédentes qui sont incluses dans le calcul). Dans ce cas, vous pouvez choisir d'inclure un maximum de 2 pas de temps précédents. Par conséquent, pour le calcul des poids du RNN, vous devrez fournir à chaque pas de temps l'entrée du pas de temps actuel (avec ses 4 caractéristiques) et l'entrée des 2 pas de temps précédents (avec 4 caractéristiques chacun). Tout comme dans cette visualisation:

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

Ainsi, au lieu de donner un (nb_samples, nb_features) matrice comme une entrée au SimpleRNN, vous devrez donner un (nb_sequences, nb_timesteps, nb_features) entrée en forme. Dans cet exemple, cela signifie qu'au lieu de donner une entrée (8x4), vous lui donnez une entrée (5x3x4).

Les keras Embedding couche pourrait faire ce travail, mais dans ce cas, vous pouvez également écrire un code court pour elle:

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

Merci pour l'explication, j'ai un problème similaire. Pourquoi les étapes maximum pour la rétropropagation dans le cas que vous commentez sont seulement 2? Et pourquoi le nombre de séquences sont 5? En passant, avec une séquence vous voulez dire une époque dans la formation? – David

+1

J'ai choisi au hasard le nombre 2 comme la quantité d'étapes précédentes pour la rétropropagation pour cet exemple. En combinaison avec le nombre (également choisi librement) de 8 échantillons, cela conduit à un total de 5 séquences. La séquence 1 comprend les échantillons 1, 2 et 3, la séquence 2 comprend 2, 3 et 4 et ainsi de suite. Voir la visualisation dans ma réponse pour plus de détails. Une époque est celle où le réseau a été entraîné avec chaque séquence une fois. Ensuite, vous recommencez avec la première séquence – Lorrit

4

L'erreur est probablement parce que les dimensions de votre entrée ne sont pas au format:

(nb_samples, timesteps, input_dim) 

Il attend 3 dimensions, et vous fournir seulement deux d'entre eux (88,88).

+0

exceptionnelle! @Tarantula Input dim est le nombre de colonnes de mon dataframe predictor, n'est-ce pas? Qu'est-ce que timesteps et nb_samples? Lignes et taille d'image? – abutremutante