2017-03-22 3 views
2

Ich habe ein Netzwerkmodell, das mit Batch-Training trainiert wird. Sobald es trainiert ist, möchte ich die Ausgabe für ein einzelnes Beispiel vorhersagen.Verwenden von Keras LSTM, um ein einzelnes Beispiel nach Verwendung von Batch-Training vorherzusagen

Hier ist mein Modellcode:

model = Sequential() 
model.add(Dense(32, batch_input_shape=(5, 1, 1))) 
model.add(LSTM(16, stateful=True)) 
model.add(Dense(1, activation='linear')) 
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy']) 

ich eine Folge von einzelnen Eingängen zu einzelnen Ausgänge haben. Ich mache einen Testcode, um Zeichen den nächsten Zeichen zuzuordnen (A-> B, B-> C, usw.).

I schaffen eine Eingangsdaten von Form (15,1,1) und einen Ausgangsdaten der Form (15, 1) und rufen die Funktion:

model.fit(x, y, nb_epoch=epochs, batch_size=5, shuffle=False, verbose=0) 

den Modelleisenbahnen, und jetzt will ich nimm ein einzelnes Zeichen und sage das nächste Zeichen voraus (Eingabe A, es sagt B voraus). Ich erstelle eine Eingabe von Form (1, 1, 1) und rufen:

pred = model.predict(x, batch_size=1, verbose=0) 

Das gibt:

ValueError: Shape mismatch: x has 5 rows but z has 1 rows 

Ich sah eine Lösung bestand darin, "Blinddaten" um Ihre Werte vorhersagen, so Die Eingabeform für die Vorhersage wäre (5,1,1) mit Daten [x 0 0 0 0] und Sie würden einfach das erste Element der Ausgabe als Ihren Wert nehmen. Dies scheint jedoch bei größeren Chargen ineffizient zu sein.

Ich habe auch versucht die Losgröße von der Modellerstellung zu entfernen, aber ich habe die folgende Meldung:

ValueError: If a RNN is stateful, a complete input_shape must be provided (including batch size). 

Gibt es eine andere Art und Weise? Danke für die Hilfe.

Antwort

0

Momentan (Keras v2.0.8) ist es etwas mühsamer, Vorhersagen für einzelne Zeilen nach dem Batch-Training zu erhalten.

Grundsätzlich ist die Batch_Size zur Trainingszeit festgelegt und muss zur Vorhersagezeit gleich sein.

Die Abhilfe jetzt die Gewicht von dem trainierten Modell zu nehmen ist, und solche, die als Gewichte in einem neuen Modell verwenden, das Sie gerade erstellt hat, die für die ein batch_size von 1.em

Der schnelle Code hat

ist
model = create_model(batch_size=64) 
mode.fit(X, y) 
weights = model.get_weights() 
single_item_model = create_model(batch_size=1) 
single_item_model.set_weights(weights) 
single_item_model.compile(compile_params) 

Hier ist ein Blog-Post, die mehr in die Tiefe geht: https://machinelearningmastery.com/use-different-batch-sizes-training-predicting-python-keras/

ich diesen Ansatz in der Vergangenheit verwendet haben mehrere Modelle Vorhersage zeit eine, die Prognosen auf großen Stapel macht Es ist eine, die Vorhersagen für kleine Mengen macht, und eine, die Vorhersagen für einzelne Artikel macht. Da Batch-Vorhersagen viel effizienter sind, können wir eine beliebige Anzahl von Vorhersagerohren (nicht nur eine Zahl, die durch batch_size teilbar ist) aufnehmen, während wir Vorhersagen sehr schnell erhalten.

Verwandte Themen