2016-06-22 9 views
4

Ich möchte ein neuronales Netzwerk erstellen, wo die beiden ersten Schichten Feedforward und die letzte ist wiederkehrend. hier ist mein Code:verschmelzen wiederkehrende Schichten mit dichten Schicht in Keras

model = Sequential() 
model.add(Dense(150, input_dim=23,init='normal',activation='relu')) 
model.add(Dense(80,activation='relu',init='normal')) 
model.add(SimpleRNN(2,init='normal')) 
adam =OP.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08) 
model.compile(loss="mean_squared_error", optimizer="rmsprop") 

und ich bekomme diese Fehlermeldung:

Exception: Input 0 is incompatible with layer simplernn_11: expected ndim=3, found ndim=2. 
model.compile(loss='mse', optimizer=adam) 

Antwort

4

Es ist korrekt, dass in Kera RNN Schicht Eingabe als erwartet. Wenn Sie jedoch eine RNN-Schicht nach einer dichten Schicht hinzufügen möchten, können Sie dies auch nach dem Umformen der Eingabe für die RNN-Schicht tun. Reshape kann sowohl als erste Schicht als auch als Zwischenschicht in einem sequentiellen Modell verwendet werden.

model = Sequential() 
model.add(Reshape((3, 4), input_shape=(12,))) 
# now: model.output_shape == (None, 3, 4) 
# note: `None` is the batch dimension 

model.add(Reshape((6, 2))) 
# now: model.output_shape == (None, 6, 2) 

Zum Beispiel, wenn Sie ändern

Reshape als Zwischenschicht in einem sequentiellen Modell

Reshape als erste Schicht in einem Sequential Modell: Beispiele sind unten angegeben Ihr Code in der folgenden Weise, dann wird es keinen Fehler geben. Ich habe es überprüft und das Modell kompiliert ohne Fehler gemeldet. Sie können die Dimension nach Ihren Bedürfnissen ändern.

from keras.models import Sequential 
from keras.layers import Dense, SimpleRNN, Reshape 
from keras.optimizers import Adam 

model = Sequential() 
model.add(Dense(150, input_dim=23,init='normal',activation='relu')) 
model.add(Dense(80,activation='relu',init='normal')) 
model.add(Reshape((1, 80))) 
model.add(SimpleRNN(2,init='normal')) 
adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08) 
model.compile(loss="mean_squared_error", optimizer="rmsprop") 
2

In Keras, können Sie keine Reccurrent Schicht nach einer dichten Schicht gesetzt, weil die dichte Schicht Ausgang gibt als (nb_samples, output_dim). Eine rekurrente Schicht erwartet jedoch die Eingabe als (nb_samples, time_steps, input_dim). Eine "Density" -Schicht gibt also einen 2-D-Ausgang, eine "Recurrent" -Schicht hingegen einen 3-D-Eingang. Sie können jedoch das Umgekehrte tun, d. H. Eine Dichten-Schicht nach einer Recurrent-Schicht einfügen.

+1

vielen Dank für Ihre Antwort, in der Tat die Eingaben, die ich hier verwenden korreliert sind, so möchte ich ein kurzes Gedächtnis in der letzten Schicht zu schaffen, die die Ausgabe des Systems zum Zeitpunkt t bedeutet, hat zu berücksichtigen, die Ausgabe zum Zeitpunkt t-1 und, (daher möchte ich, dass die letzte Schicht wiederholt zwei vorausgehende Schichten vorausgeht) Weißt du, wie kann ich die Anzahl der Sequenzen (time_steps) variabel machen? –

Verwandte Themen