2016-03-17 17 views
12

Ich bekomme immer einen input_shape Fehler aus dem folgenden Code.Warum bekomme ich einen Keras LSTM RNN input_shape Fehler?

from keras.models import Sequential 
from keras.layers.core import Dense, Activation, Dropout 
from keras.layers.recurrent import LSTM 

def _load_data(data): 
    """ 
    data should be pd.DataFrame() 
    """ 
    n_prev = 10 
    docX, docY = [], [] 
    for i in range(len(data)-n_prev): 
     docX.append(data.iloc[i:i+n_prev].as_matrix()) 
     docY.append(data.iloc[i+n_prev].as_matrix()) 
    if not docX: 
     pass 
    else: 
     alsX = np.array(docX) 
     alsY = np.array(docY) 
     return alsX, alsY 

X, y = _load_data(dframe) 
poi = int(len(X) * .8) 
X_train = X[:poi] 
X_test = X[poi:] 
y_train = y[:poi] 
y_test = y[poi:] 

input_dim = 3 

Alles oben genannte läuft glatt. Hier läuft es schief.

in_out_neurons = 2 
hidden_neurons = 300 
model = Sequential() 
#model.add(Masking(mask_value=0, input_shape=(input_dim,))) 
model.add(LSTM(in_out_neurons, hidden_neurons, return_sequences=False, input_shape=(len(full_data),))) 
model.add(Dense(hidden_neurons, in_out_neurons)) 
model.add(Activation("linear")) 
model.compile(loss="mean_squared_error", optimizer="rmsprop") 
model.fit(X_train, y_train, nb_epoch=10, validation_split=0.05) 

Es gibt diesen Fehler zurück.

Exception: Invalid input shape - Layer expects input ndim=3, was provided with input shape (None, 10320) 

Wenn ich überprüfe the website sagt es ein Tupel zu spezifizieren "(z.B. (100,) für 100-dimensionale Eingänge)."

Das heißt, mein Datensatz besteht aus einer Spalte mit einer Länge von 10320. Ich nehme an, dass das bedeutet, dass ich (10320,) als Eingabe shape setzen sollte, aber ich bekomme den Fehler sowieso. Hat jemand eine Lösung?

+0

irgendein Glück mit diesem? – Radix

+0

Kein Typ. Es ist eine Tragödie. Ich musste deswegen zur Beratung gehen. Ich brach. – NickTheInventor

+0

Gefunden das - scheint wie Sie manuell die Epochen durchführen müssen (letztes Bit des Codes): https://github.com/fchollet/keras/blob/master/examples/stateful_lstm.py – Radix

Antwort

0

Versuchen Sie, die LSTM-Ebene zu verwenden, ohne die Eingabeform anzugeben. Lass Keras die Arbeit für dich erledigen. Ich denke, du hast die Maskierung ebenfalls kommentiert, weil du ähnliche Probleme bekommst. Ich habe es vorher gesehen und es stellt sich heraus das input_shape = (time_steps, input_dim). Ich denke, das passiert aufgrund der neuen automatischen Formschlussfolgerung in Keras.

4

Mein Verständnis ist, dass sowohl Ihre Eingabe als auch Ihre Ausgabe eindimensionale Vektoren sind. Der Trick besteht darin, sie per Keras Anforderungen neu zu gestalten:

from keras.models import Sequential 
from keras.layers.core import Dense, Activation, Dropout 
from keras.layers.recurrent import LSTM 
import numpy as np 

X= np.random.rand(1000) 
y = 2*X 

poi = int(len(X) * .8) 
X_train = X[:poi] 
y_train = y[:poi] 

X_test = X[poi:] 
y_test = y[poi:] 

# you have to change your input shape (nb_samples, timesteps, input_dim) 
X_train = X_train.reshape(len(X_train), 1, 1) 
# and also the output shape (note that the output *shape* is 2 dimensional) 
y_train = y_train.reshape(len(y_train), 1) 


#in_out_neurons = 2 
in_out_neurons = 1 

hidden_neurons = 300 
model = Sequential() 
#model.add(Masking(mask_value=0, input_shape=(input_dim,))) 
model.add(LSTM(hidden_neurons, return_sequences=False, batch_input_shape=X_train.shape)) 
# only specify the output dimension 
model.add(Dense(in_out_neurons)) 
model.add(Activation("linear")) 
model.compile(loss="mean_squared_error", optimizer="rmsprop") 
model.fit(X_train, y_train, nb_epoch=10, validation_split=0.05) 

# calculate test set MSE 
preds = model.predict(X_test).reshape(len(y_test)) 
MSE = np.mean((preds-y_test)**2) 

Hier sind die wichtigsten Punkte:

  • wenn Sie Ihre erste Schicht hinzufügen, sind Sie verpflichtet, die Anzahl der versteckten Knoten zu spezifizieren, und Ihre Eingabe gestalten. Konsequente Schichten erfordern nicht die Eingabeform, wie sie es von dem verborgenen Knoten der vorherigen Schicht
  • In ähnlicher Weise für die Ausgabeschicht nur geben Sie die Anzahl von Ausgangsknoten ableiten können Sie

this helps .

1

Weitere Informationen: Wenn Sie RNN (wie LSTM) mit Sequenzen variabler Länge verwenden, müssen Sie das Format Ihrer Daten verwenden.

Wenn Sie Sequenzen gruppieren, um sie an die Fit - Methode zu übergeben, wird Keras versuchen, eine Matrix von Samples zu erstellen, was bedeutet, dass alle Input - Sequenzen die gleiche Größe haben müssen, sonst haben Sie keine Matrix korrekte Dimension.

Es gibt mehrere mögliche Lösungen:

  1. schulen Ihr Netzwerk Proben unter Verwendung eines nach dem anderen (mit fit_generator zum Beispiel)
  2. Pad alle Sequenzen, so dass sie die gleiche Größe
  3. Gruppensequenzen, die durch Größe haben (eventuell auffüllen) und Ihre Netzwerkgruppe gruppenweise trainieren (wieder unter Verwendung der Generator-basierten Anpassung)

Die dritte Lösung entspricht der häufigsten Strategie mit va klägliche Größe. Und wenn Sie Sequenzen (zweite oder dritte Lösung) auffüllen, möchten Sie vielleicht eine Maskierungsschicht als Eingabe hinzufügen.

Wenn Sie nicht sicher sind, versuchen Sie die Form Ihrer Daten drucken

Sie müssen möglicherweise betrachten (die Form Attribut des numpy Array.): https://keras.io/preprocessing/sequence/ (pad_sequences) und https://keras.io/layers/core/#masking

0

Im Anschluss ist die Arbeitsversion mit Keras 2.0.0, Modified radix Code

from keras.models import Sequential 
from keras.layers.core import Dense, Activation, Dropout 
from keras.layers.recurrent import LSTM 
import numpy as np 

X= np.random.rand(1000) 
y = 2 * X 

poi = int(len(X) * .8) 
X_train = X[:poi] 
y_train = y[:poi] 

X_test = X[poi:] 
y_test = y[poi:] 

# you have to change your input shape (nb_samples, timesteps, input_dim) 
X_train = X_train.reshape(len(X_train), 1, 1) 
# and also the output shape (note that the output *shape* is 2 dimensional) 
y_train = y_train.reshape(len(y_train), 1) 

# Change test data's dimension also. 
X_test = X_test.reshape(len(X_test),1,1) 
y_test = y_test.reshape(len(y_test),1) 


#in_out_neurons = 2 
in_out_neurons = 1 

hidden_neurons = 300 
model = Sequential() 
# model.add(Masking(mask_value=0, input_shape=(input_dim,))) 
# Remove batch_input_shape and add input_shape = (1,1) - Imp change for Keras 2.0.0 
model.add(LSTM(hidden_neurons, return_sequences=False, input_shape=(X_train.shape[1],X_train.shape[2]))) 
# only specify the output dimension 
model.add(Dense(in_out_neurons)) 
model.add(Activation("linear")) 
model.compile(loss="mean_squared_error", optimizer="rmsprop") 
model.summary() 
model.fit(X_train, y_train, epochs=10, validation_split=0.05) 

# calculate test set MSE 
preds = model.predict(X_test).reshape(len(y_test)) 
print(preds) 
MSE = np.mean((preds-y_test)**2) 
print('MSE ', MSE) 
Verwandte Themen