Wie kann ich eine Vorhersage für nur eine Instanz in Keras erhalten?

13

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?

Hendrik
quelle

Antworten:

12

Du kannst tun:

q = model.predict( np.array( [single_x_test,] )  )
Alexandre Meyer
quelle
Welches gibt auch ein numpy.ndarray. Um genau den Wert zu erhalten, den Sie möchten:q = model.predict(np.array([single_x_test]))[0]
Loisaida Sam Sandberg
7

predict_classeserwartet ein 2D-Array von Formen (num_instances, features), wie es X_testist. Die Indizierung einer einzelnen Instanz wie in X_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]

Ken Arnold
quelle
Es scheint nicht zu funktionieren: keine Fehlermeldung, aber auch keine Ausgabe. Seltsam.
Hendrik
5

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

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-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.

ClimbsRocks
quelle
3

Dies wäre die Vorhersage für ein Element, diesmal Nummer 17.

model.predict_classes(X_test[17:18])
qutorial
quelle
Was ist los mit der Antwort?
Supamee
2

Sie sollten eine Liste mit nur einem Beispiel übergeben. Ich kann sie derzeit nicht testen, aber dies sollte funktionieren:

model1.predict_classes([X_test[10]])
Jan van der Vegt
quelle
Es funktioniert leider nicht.
Hendrik
1
self.result = self.model.predict(X)

Dabei ist X ein Numpy-Array. Das ist alles was ich getan habe und es hat funktioniert.

Meghna
quelle
1

Ich habe dies mit dem folgenden Ansatz behoben:

single_test = X_test[10]
single_test = single_test.reshape(1,784)

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.

Rimi
quelle
1

Wenn Sie versuchen, die Instanz auszudrucken, wird Folgendes angezeigt:

x_test:\n
array([[0., 1., 1., ..., 0., 0., 0.],
        [0., 1., 1., ..., 0., 0., 0.],
        [0., 1., 1., ..., 0., 0., 0.],
        ...,
        [0., 1., 0., ..., 0., 0., 0.],
        [0., 1., 1., ..., 0., 0., 0.],
        [0., 1., 1., ..., 0., 0., 0.]])

x_test[0]:
array([0., 1., 1., ..., 0., 0., 0.])

Ich denke, wir können einfach eine Dimension mit np.array hinzufügen:

mode.predict(np.array(x_test[0],ndmin=2))
Krince Liu
quelle
0

Dies bedeutet, dass Ihre Trainingsdaten die Form (784, 1) hatten. Sie können es einfach wie folgt umformen. Es hat bei mir funktioniert.

model1.predict_classes(X_test[10].reshape(784,1))

Sie können auch tun, transpose()wenn die Form (1.784) ist,

model1.predict_classes(X_test[10].transpose())
Schwerkraftmasse
quelle