Warum Keras LSTM batch-Größe für die Vorhersage verwendet werden, die gleichen wie passend batch-Größe?
Bei Verwendung eines Keras LSTM zur Vorhersage von Zeitreihen Daten, die ich habe immer Fehler, wenn ich versuche zu trainieren, das Modell mit Hilfe einer batch-Größe von 50, und dann zu versuchen, vorherzusagen, die auf das gleiche Modell mit einer batch-Größe von 1 (d.h. nur die Vorhersage des nächsten Wertes).
Warum bin ich nicht in der Lage zu trainieren und fit Modell mit mehreren Chargen auf einmal, und verwenden Sie dann das Modell, um Vorhersagen für alles andere als die gleiche batch-Größe. Es scheint nicht sinnvoll, aber dann könnte ich mir einfach etwas fehlen zu diesem.
Edit: das ist das Modell. batch_size
50 sl
ist Sequenz-Länge, die ist auf 20 festgelegt, derzeit.
model = Sequential()
model.add(LSTM(1, batch_input_shape=(batch_size, 1, sl), stateful=True))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=epochs, batch_size=batch_size, verbose=2)
hier ist die Linie für die Vorhersage auf dem Trainings-set für RMSE
# make predictions
trainPredict = model.predict(trainX, batch_size=batch_size)
hier ist die aktuelle Vorhersage der unsichtbaren Zeit, die Schritte
for i in range(test_len):
print('Prediction %s: ' % str(pred_count))
next_pred_res = np.reshape(next_pred, (next_pred.shape[1], 1, next_pred.shape[0]))
# make predictions
forecastPredict = model.predict(next_pred_res, batch_size=1)
forecastPredictInv = scaler.inverse_transform(forecastPredict)
forecasts.append(forecastPredictInv)
next_pred = next_pred[1:]
next_pred = np.concatenate([next_pred, forecastPredict])
pred_count += 1
Dieses Problem ist mit der Zeile:
forecastPredict = model.predict(next_pred_res, batch_size=batch_size)
Den Fehler bei der batch_size hier wird auf 1 gesetzt ist:
ValueError: Cannot feed value of shape (1, 1, 2) for Tensor 'lstm_1_input:0', which has shape '(10, 1, 2)'
denen ist der gleiche Fehler wirft, wenn batch_size
hier auf 50 eingestellt wie die anderen batch-Größen sowie.
Den total Fehler:
forecastPredict = model.predict(next_pred_res, batch_size=1)
File "/home/entelechy/tf_keras/lib/python3.5/site-packages/keras/models.py", line 899, in predict
return self.model.predict(x, batch_size=batch_size, verbose=verbose)
File "/home/entelechy/tf_keras/lib/python3.5/site-packages/keras/engine/training.py", line 1573, in predict
batch_size=batch_size, verbose=verbose)
File "/home/entelechy/tf_keras/lib/python3.5/site-packages/keras/engine/training.py", line 1203, in _predict_loop
batch_outs = f(ins_batch)
File "/home/entelechy/tf_keras/lib/python3.5/site-packages/keras/backend/tensorflow_backend.py", line 2103, in __call__
feed_dict=feed_dict)
File "/home/entelechy/tf_keras/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 767, in run
run_metadata_ptr)
File "/home/entelechy/tf_keras/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 944, in _run
% (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape())))
ValueError: Cannot feed value of shape (1, 1, 2) for Tensor 'lstm_1_input:0', which has shape '(10, 1, 2)'
Edit: Nachdem ich das Modell stateful=False
dann bin ich in der Lage zu nutzen, unterschiedliche Losgrößen für die Montage/Schulung und Vorhersage. Was ist der Grund dafür?
- Batch-Größe wird nicht mehr so funktionieren wie das, was Sie beschreiben, ergänzen Sie bitte details und code.
- Hinzugefügt Fehler und die entsprechende code
- Wenn Sie übergeben einen Stapel mit Größe 1, stellen Sie sicher, es ist immer noch ein array mit genau der gleichen Form wie die Ausbildung-array, mit der Ausnahme, dass 50 wird 1. Stellen Sie sicher, dass Sie haven ' T verloren eine dimension transformieren (50, 1, sl) in die gerade (1,sl). Es sollte gehalten werden (1,1,sl).
- hey danke für die Antwort. Ja, ich habe durchgemacht, um zu überprüfen, für die richtige Dimensionalität, ich denke, es ist alles gut so weit als ich kann erzählen. Der Fehler msg ist ValueError: Nicht füttern Wert der Form (1, 1, 2) - Tensor 'lstm_1_input:0', hat die Form '(10, 1, 2)' sowieso
- Ich habe vor dem ähnlichen Problem. Aber ich habe diesen link gefunden:machinelearningmastery.com/... wirklich hilfreich. Leben retten....
- auch versuchen Sie, diese zehn-Minuten-Einführung
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider, was Sie tun möchten ist unmöglich mit Keras ... ich habe auch Probleme eine Menge Zeit auf diese Probleme und der einzige Weg ist, Tauchen Sie in das Kaninchen-Loch und arbeiten mit Tensorflow direkt zu tun LSTM rolling Vorhersage.
Ersten, klar, Terminologie,
batch_size
bedeutet in der Regel die Anzahl der Sequenzen, die ausgebildet sind, zusammen, undnum_steps
bedeutet, wie viele Zeitschritte trainiert sind, zusammen. Wenn du meinstbatch_size=1
und "nur die Vorhersage des nächsten Wertes", ich denke, du meintest, um vorauszusagen, mitnum_steps=1
.Ansonsten sollte es möglich sein, zu trainieren und zu prognostizieren
batch_size=50
Bedeutung sind Sie mit dem training auf der 50-Sequenzen und machen 50 Vorhersagen jedes mal, wenn Schritt, für jede sequence (d.h. Ausbildung/Vorhersagenum_steps=1
).Aber ich denke, das was du meinst ist, das Sie verwenden möchten stateful LSTM, mit dem Zug
num_steps=50
tun und die Vorhersage mitnum_steps=1
. Dies theoretisch machen, Sinne und sollte möglich sein, und es ist möglich, mit Tensorflow, nur nicht Keras.Das problem: Keras erfordert eine explizite batch-Größe für stateful RNN. Sie müssen angeben, batch_input_shape (batch_size, num_steps, Funktionen).
Der Grund: Keras verteilen müssen eine Feste Größe-versteckte zustandsvektors in der computation-graph mit Form (batch_size, num_units) um das fortbestehen der Werte zwischen Trainings-Chargen. Auf der anderen Seite, wenn
stateful=False
die ausgeblendeten Zustand kann der Vektor initialisiert werden dynamisch mit Nullen am Anfang jeder batch, so dass Sie nicht brauchen, eine Feste Größe zu werden. Mehr details hier: http://philipperemy.github.io/keras-stateful-lstm/Möglich umgehen: Zug und Vorhersagen mit
num_steps=1
. Beispiel: https://github.com/keras-team/keras/blob/master/examples/lstm_stateful.py. Dies möglicherweise oder möglicherweise nicht arbeiten für Ihr problem, da die Steigung für back-propagation berechnet wird nur auf einem Zeitschritt. Siehe: https://github.com/fchollet/keras/issues/3669Meine Lösung: verwenden Sie Tensorflow: In Tensorflow können Sie trainieren mit
batch_size=50, num_steps=100
, dann tun Sie Vorhersagen mitbatch_size=1, num_steps=1
. Dies ist möglich durch die Erstellung eines anderen Modells Diagramm für die Ausbildung und die Vorhersage, welche die gleiche RNN Gewicht Matrizen. Siehe das Beispiel für die next-Charakter Vorhersage: https://github.com/sherjilozair/char-rnn-tensorflow/blob/master/model.py#L11 und blog-post http://karpathy.github.io/2015/05/21/rnn-effectiveness/. Beachten Sie, dass ein graph kann immer noch nur mit einer angegebenenbatch_size
, aber einstellen können Sie mehrere Modell-Graphen-sharing-GEWICHTE in Tensorflow.batch_size
undnum_steps
wieder? Ich habe eigentlich nie verwendet oder gesehennum_step
und dachtebatch_size
war nur, wie viele Fenster sind geschult in der gleichen Zeit. Was ist der Unterschied zwischen einer Sequenz und einer Zeit Schritt?batch_size
undnum_steps
als wenn es ausgebildet wurde.Leider, was Sie wollen, ist unmöglich, weil Sie angeben, batch_size, wenn Sie definieren das Modell...
Allerdings fand ich eine einfache Möglichkeit, dieses problem umgehen: erstellen Sie 2 Modelle! Die erste ist für die Ausbildung verwendet und die zweite für die Vorhersagen, und Sie teilen GEWICHTE:
Jetzt können Sie beliebige batch-Größe, die Sie wollen. nachdem Sie passen Sie Ihre train_model einfach nur speichern Sie es GEWICHTE und laden Sie Sie mit der predict_model:
beachten Sie, dass Sie nur speichern möchten, und laden Sie die GEWICHTE, und nicht das ganze Modell (die auch die Architektur, optimizer, usw...). Auf diese Weise erhalten Sie die GEWICHTE, aber Sie können die Eingabe einer batch-zu einer Zeit,...
mehr auf keras speichern/laden von Modellen:
https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model
beachten Sie, dass Sie brauchen, um zu installieren h5py zu verwenden "speichern " GEWICHTE".
Anderen einfachen workaround:
Die beste Lösung für dieses problem ist das "Kopieren " GEWICHTE". Es kann sehr hilfreich sein, wenn Sie wollen, zu trainieren & Vorhersagen mit Ihren LSTM-Modell mit unterschiedlichen Losgrößen.
Zum Beispiel, wenn Sie ausgebildet haben, Ihr Modell mit 'n' batch-Größe wie unten gezeigt:
Und jetzt wollen Sie möchten Werte vorhergesagt weniger als Ihre batch-Größe, wobei n=1.
Was Sie tun können, ist, dass, kopieren Sie die GEWICHTE Ihrer fit-Modell und initialisieren Sie das neue Modell LSTM-Modell mit der gleichen Architektur und der Losgröße gleich 1.
Können Sie jetzt ganz einfach vorherzusagen und zu trainieren LSTMs mit unterschiedlichen Losgrößen.
Für mehr Informationen Lesen Sie bitte: https://machinelearningmastery.com/use-different-batch-sizes-training-predicting-python-keras/
Fand ich unter hilfreich (und völlig inline mit oben). Der Abschnitt "Lösung 3: Copy-GEWICHTE" für mich gearbeitet:
Die Verwendung Verschiedener Losgrößen, wenn die Ausbildung und die Vorhersage mit LSTMs, von Jason Brownlee
Ich habe auch gleiche problem und es behoben.
In einer anderen Art und Weise, können Sie Ihre GEWICHTE, wenn Sie Ihren test-Ergebnis, laden Sie Ihr Modell mit der gleichen Architektur und
batch_size=1
wie folgt:Wird es gut funktionieren. Ich hoffe, es wird hilfreich für Sie.