96 votes

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

Je joue avec l'ensemble de données reuters-example et cela fonctionne bien (mon modèle est formé). J'ai lu comment sauvegarder un modèle, afin de pouvoir le charger plus tard pour le réutiliser. Mais comment puis-je utiliser ce modèle sauvegardé pour prédire un nouveau texte ? Dois-je utiliser models.predict() ?

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

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 j'ai 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 manière de faire des prédictions avec un modèle entraîné ?

62voto

nemo Points 13983

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

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

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

0 votes

Existe-t-il un moyen d'imprimer uniquement les k premiers en utilisant la probabilité de keras softmax ?

1 votes

@donald Oui. Il suffit d'ajouter 'top_k_categorical_accuracy' à vos paramètres dans le champ fit() .

11voto

Alex Punnen Points 336
model.predict_classes(<numpy_array>)

Echantillon https://gist.github.com/alexcpn/0683bb940cae510cf84d5976c1652abd

5voto

Thomas Decaux Points 2613

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.

Alors, j'utilise :

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

model.predict(np.array(tokens))

3voto

Nicolas Gervais Points 21795

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]])>

1voto

J'ai formé un réseau neuronal dans Keras pour effectuer une régression non linéaire sur certaines données. Voici 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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X