Keras, wie kann ich vorhersagen, nachdem ich ein Modell trainiert habe?


87

Ich spiele mit dem reuters-Beispieldatensatz und er läuft einwandfrei (mein Modell ist trainiert). Ich habe gelesen, wie ein Modell gespeichert wird, damit ich es später laden und wieder verwenden kann. Aber wie verwende ich dieses gespeicherte Modell, um einen neuen Text vorherzusagen? Muss ich verwenden models.predict()?

Muss ich diesen Text auf besondere Weise vorbereiten?

Ich habe es mit versucht

import keras.preprocessing.text

text = np.array(['this is just some random, stupid text'])
print(text.shape)

tk = keras.preprocessing.text.Tokenizer(
        nb_words=2000,
        filters=keras.preprocessing.text.base_filter(),
        lower=True,
        split=" ")

tk.fit_on_texts(text)
pred = tk.texts_to_sequences(text)
print(pred)

model.predict(pred)

Aber ich bekomme immer

(1L,)
[[2, 4, 1, 6, 5, 7, 3]]
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-83-42d744d811fb> in <module>()
      7 print(pred)
      8 
----> 9 model.predict(pred)

C:\Users\bkey\Anaconda2\lib\site-packages\keras\models.pyc in predict(self, x, batch_size, verbose)
    457         if self.model is None:
    458             self.build()
--> 459         return self.model.predict(x, batch_size=batch_size, verbose=verbose)
    460 
    461     def predict_on_batch(self, x):

C:\Users\bkey\Anaconda2\lib\site-packages\keras\engine\training.pyc in predict(self, x, batch_size, verbose)
   1132         x = standardize_input_data(x, self.input_names,
   1133                                    self.internal_input_shapes,
-> 1134                                    check_batch_dim=False)
   1135         if self.stateful:
   1136             if x[0].shape[0] > batch_size and x[0].shape[0] % batch_size != 0:

C:\Users\bkey\Anaconda2\lib\site-packages\keras\engine\training.pyc in standardize_input_data(data, names, shapes, check_batch_dim, exception_prefix)
     79     for i in range(len(names)):
     80         array = arrays[i]
---> 81         if len(array.shape) == 1:
     82             array = np.expand_dims(array, 1)
     83             arrays[i] = array

AttributeError: 'list' object has no attribute 'shape'

Haben Sie Empfehlungen, wie Sie mit einem trainierten Modell Vorhersagen treffen können?

Antworten:


61

model.predict()erwartet, dass der erste Parameter ein Numpy-Array ist. Sie geben eine Liste an, die nicht das shapeAttribut eines numpy-Arrays enthält.

Ansonsten sieht Ihr Code gut aus, außer dass Sie mit der Vorhersage nichts anfangen. Stellen Sie sicher, dass Sie es in einer Variablen speichern, zum Beispiel wie folgt:

prediction = model.predict(np.array(tk.texts_to_sequences(text)))
print(prediction)

Gibt es eine Möglichkeit, nur Top K mit Keras Softmax-Wahrscheinlichkeit zu drucken?
Donald

1
@ Donald Ja. Fügen Sie einfach 'top_k_categorical_accuracy' zu Ihren Metriken in hinzu fit().
Nemo


5

Sie müssen denselben Tokenizer verwenden, mit dem Sie Ihr Modell erstellt haben!

Andernfalls wird jedem Wort ein anderer Vektor zugewiesen.

Dann benutze ich:

phrase = "not good"
tokens = myTokenizer.texts_to_matrix([phrase])

model.predict(np.array(tokens))

1

Ich habe ein neuronales Netzwerk in Keras trainiert, um für einige Daten eine nichtlineare Regression durchzuführen. Dies ist ein Teil meines Codes zum Testen neuer Daten unter Verwendung zuvor gespeicherter Modellkonfigurationen und Gewichte.

fname = r"C:\Users\tauseef\Desktop\keras\tutorials\BestWeights.hdf5"
modelConfig = joblib.load('modelConfig.pkl')
recreatedModel = Sequential.from_config(modelConfig)
recreatedModel.load_weights(fname)
unseenTestData = np.genfromtxt(r"C:\Users\tauseef\Desktop\keras\arrayOf100Rows257Columns.txt",delimiter=" ")
X_test = unseenTestData
standard_scalerX = StandardScaler()
standard_scalerX.fit(X_test)
X_test_std = standard_scalerX.transform(X_test)
X_test_std = X_test_std.astype('float32')
unseenData_predictions = recreatedModel.predict(X_test_std)

1

Sie können Ihr Modell einfach mit einem Array der richtigen Form "aufrufen":

model(np.array([[6.7, 3.3, 5.7, 2.5]]))

Vollständiges Beispiel:

from sklearn.datasets import load_iris
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential
import numpy as np

X, y = load_iris(return_X_y=True)

model = Sequential([
    Dense(16, activation='relu'),
    Dense(32, activation='relu'),
    Dense(1)])

model.compile(loss='mean_absolute_error', optimizer='adam')

history = model.fit(X, y, epochs=10, verbose=0)

print(model(np.array([[6.7, 3.3, 5.7, 2.5]])))
<tf.Tensor: shape=(1, 1), dtype=float64, numpy=array([[1.92517677]])>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.