Wenn ich Keras auffordere, eine Vorhersage mit einem angepassten Modell auf einen neuen Datensatz ohne solche Bezeichnung anzuwenden:
model1.predict_classes(X_test)
es funktioniert gut. Aber wenn ich versuche, nur eine Zeile vorherzusagen, schlägt dies fehl:
model1.predict_classes(X_test[10])
Exception: Error when checking : expected dense_input_6 to have shape (None, 784) but got array with shape (784, 1)
Ich wundere mich warum?
neural-network
keras
Hendrik
quelle
quelle
numpy.ndarray
. Um genau den Wert zu erhalten, den Sie möchten:q = model.predict(np.array([single_x_test]))[0]
predict_classes
erwartet ein 2D-Array von Formen(num_instances, features)
, wie esX_test
ist. Die Indizierung einer einzelnen Instanz wie inX_test[10]
gibt jedoch ein 1D-Array von Formen zurück(features,)
.Um die zusätzliche Achse wieder hinzuzufügen, können Sie sie verwenden oder sie zunächst entfernen (z. B. mithilfe von ).
np.expand_dims
(X_test[10], axis=0)
X_test[10][np.newaxis,:]
X_test[10:11]
quelle
Derzeit (Keras v2.0.8) ist es etwas aufwändiger, 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 Problemumgehung besteht derzeit darin, die Gewichte aus dem trainierten Modell zu übernehmen und diese als Gewichte in einem neuen Modell zu verwenden, das Sie gerade erstellt haben und das eine Stapelgröße von 1 hat.
Der Schnellcode dafür ist
Hier ist ein Blog-Beitrag, der ausführlicher behandelt wird: https://machinelearningmastery.com/use-different-batch-sizes-training-predicting-python-keras/
Ich habe diesen Ansatz in der Vergangenheit verwendet, um mehrere Modelle zur Vorhersagezeit zu haben - eines, das Vorhersagen für große Chargen macht, eines, das Vorhersagen für kleine Chargen macht, und eines, das Vorhersagen für einzelne Elemente macht. Da Stapelvorhersagen viel effizienter sind, haben wir die Flexibilität, eine beliebige Anzahl von Vorhersagezeilen aufzunehmen (nicht nur eine Zahl, die gleichmäßig durch batch_size teilbar ist), während wir dennoch ziemlich schnell Vorhersagen erhalten.
quelle
Dies wäre die Vorhersage für ein Element, diesmal Nummer 17.
quelle
Sie sollten eine Liste mit nur einem Beispiel übergeben. Ich kann sie derzeit nicht testen, aber dies sollte funktionieren:
quelle
Dabei ist X ein Numpy-Array. Das ist alles was ich getan habe und es hat funktioniert.
quelle
Ich habe dies mit dem folgenden Ansatz behoben:
Bitte beachten Sie, dass die Anzahl der Funktionen (784) in der Umformungsfunktion auf Ihrem obigen Beispiel basiert. Wenn Sie weniger Funktionen haben, müssen Sie diese anpassen.
Hoffe, es wird auch für Sie funktionieren.
quelle
Wenn Sie versuchen, die Instanz auszudrucken, wird Folgendes angezeigt:
Ich denke, wir können einfach eine Dimension mit np.array hinzufügen:
quelle
Dies bedeutet, dass Ihre Trainingsdaten die Form (784, 1) hatten. Sie können es einfach wie folgt umformen. Es hat bei mir funktioniert.
Sie können auch tun,
transpose()
wenn die Form (1.784) ist,quelle