Keras, comment prédire après avoir formé un modèle?

87

Je joue avec le jeu de données de l'exemple de reuters et il fonctionne bien (mon modèle est entraîné). J'ai lu comment enregistrer un modèle afin de pouvoir le charger plus tard pour le réutiliser. Mais comment utiliser ce modèle enregistré pour prédire un nouveau texte? Dois-je utiliser models.predict()?

Dois-je préparer ce texte d'une manière spéciale?

Je l'ai essayé avec

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)

Mais je reçois toujours

(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'

Avez-vous des recommandations sur la façon de faire des prédictions avec un modèle entraîné?

ben
la source

Réponses:

61

model.predict()s'attend à ce que le premier paramètre soit un tableau numpy. Vous fournissez une liste, qui n'a pas l' shapeattribut d'un tableau numpy.

Sinon, votre code semble correct, sauf que vous ne faites rien avec la prédiction. Assurez-vous de le stocker dans une variable, par exemple comme ceci:

prediction = model.predict(np.array(tk.texts_to_sequences(text)))
print(prediction)
nemo
la source
existe-t-il un moyen d'imprimer uniquement le top k en utilisant la probabilité keras softmax?
donald
1
@donald Oui. Ajoutez simplement "top_k_categorical_accuracy" à vos métriques dans fit().
nemo
5

Vous devez utiliser le même Tokenizer que vous avez utilisé pour construire votre modèle!

Sinon, cela donnera un vecteur différent à chaque mot.

Ensuite, j'utilise:

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

model.predict(np.array(tokens))
Thomas Decaux
la source
1

J'ai formé un réseau de neurones dans Keras pour effectuer une régression non linéaire sur certaines données. Ceci est une partie de mon code pour tester de nouvelles données en utilisant la configuration et les poids du modèle précédemment enregistrés.

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)
tauseef_CuriousGuy
la source
1

Vous pouvez simplement "appeler" votre modèle avec un tableau de la forme correcte:

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

Exemple complet:

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]])>
Nicolas Gervais
la source