2

Ich habe Probleme beim Versuch gefunden, ein Netzwerk mit einer wiederkehrenden Schicht zu kompilieren. Es scheint, dass es ein Problem mit der Dimensionalität der ersten Schicht gibt und somit mein Verständnis davon, wie RNN-Schichten in Keras funktionieren.Keras einfache RNN-Implementierung

Mein Codebeispiel ist:

model.add(Dense(8, 
       input_dim = 2, 
       activation = "tanh", 
       use_bias = False)) 
model.add(SimpleRNN(2, 
        activation = "tanh", 
        use_bias = False)) 
model.add(Dense(1, 
       activation = "tanh", 
       use_bias = False)) 

Der Fehler ist

ValueError: Input 0 is incompatible with layer simple_rnn_1: expected ndim=3, found ndim=2 

Dieser Fehler wird unabhängig von input_dim Wert zurückgegeben. Was vermisse ich ?

Antwort

2

Diese Nachricht bedeutet: Der Eingang, der in den RNN geht, hat 2 Dimensionen, aber eine RNN-Schicht erwartet 3 Dimensionen.

Für eine RNN-Schicht benötigen Sie Eingänge in der Form (BatchSize, TimeSteps, FeaturesPerStep). Dies sind die 3 erwarteten Dimensionen. Eine Dense Schicht (in Keras 2) kann entweder mit 2 oder 3 Dimensionen arbeiten. Wir können sehen, dass Sie mit 2 arbeiten, weil Sie eine input_dim statt input_shape=(Steps,Features) übergeben haben.

Es gibt viele mögliche Wege, um dies zu lösen, aber die sinnvollste und logischste wäre ein Fall, wo Ihre Eingabedaten eine Sequenz mit Zeitschritten ist.

Lösung 1 - Ihre Trainingsdaten ist eine Folge:

Wenn Ihre Trainingsdaten eine Sequenz ist, können Sie es wie (NumberOfSamples, TimeSteps, Features) Form und es zu einem Modell übergeben. Stellen Sie sicher, dass Sie input_shape=(TimeSteps,Features) in der ersten Schicht anstelle von input_dim verwenden.

Lösung 2 - Sie haben die Ausgabe der ersten dichten Schicht neu zu gestalten, so dass es die zusätzliche Dimension hat:

model.add(Reshape((TimeSteps,Features))) 

Vergewissern Sie sich, dass das Produkt TimeSteps*Features zu 8, die Ausgabe Ihrer ersten dichten Schicht gleich ist .

+0

Super, danke, eine zusätzliche Frage. Erste Lösung funktioniert perfekt, aber was, wenn ich unendliche Zeitschritte haben will (theoretische Frage, ich weiß, unendliche Zeitschritte ist dumm)? Dann muss ich Ihre zweite Lösung mit dem Umformen der Ausgabe von der ersten Schicht verwenden. Aber ich habe einen einfachen Test mit den XOR-Sequenzen gemacht, und als ich die Ausgabe mische, konnte das Netzwerk nicht so reagieren, wie ich es erwartet hatte. Besser gesagt, es gab die gleichen Ergebnisse wie vor dem Mischen. Wie wirkt sich die Umformung auf das Arbeiten der wiederkehrenden Schicht aus (im Vergleich zur ersten Lösung)? – Seraph

+1

Umformen nimmt nur die Daten (alle Daten), die nichts anderes als eine gerade Folge von Zahlen in Segmente unterteilt ist. Angenommen, Sie haben 300 Elemente. Wenn Sie sie wie (30,10,1) umformen, haben Sie diese 300 Elemente auf eine andere Weise getrennt. Wenn Sie also zu Sequenzzwecken umgestalten, müssen Sie eine Vorstellung davon haben, was Sie erreichen möchten und wie das Format Ihrer Daten aussehen soll, damit Sie es in einer signifikanten Weise umformen können. –

+0

Für Ihre unendliche Sequenz sollten Sie wahrscheinlich mit einer Eingabe von nur 1 Beispiel '(BatchSize = 1, TimeSteps, Features)' arbeiten und Ihre wiederkehrenden Layer mit 'stateful = True 'markieren. Dies bedeutet, dass die Schichten ihren Speicher beibehalten und der nächste Stapel den vorherigen Stapel in einer einzigen Sequenz fortsetzen wird. In diesem Fall müssen Sie "den Speicher löschen" ("Reset-Zustände" genannt) manuell ausführen, wenn Sie sich dafür entscheiden, dass eine Sequenz beendet ist und Sie eine andere Sequenz zuführen. –