web-dev-qa-db-fra.com

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

Je joue avec l'ensemble de données reuters-example et tout fonctionne bien (mon modèle est formé). J'ai lu comment sauvegarder un modèle pour pouvoir le charger plus tard et l'utiliser à nouveau. Mais comment utiliser ce modèle enregistré pour prédire un nouveau texte? Est-ce que j'utilise models.predict()?

Dois-je préparer ce texte de manière spéciale?

J'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évisions avec un modèle formé?

50
ben

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

Sinon, votre code paraît bien, 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)
36
nemo
model.predict_classes(<numpy_array>)

Exemple https://Gist.github.com/alexcpn/0683bb940cae510cf84d5976c1652abd

4
Alex Punnen

J'ai formé un réseau de neurones à Keras pour effectuer une régression non linéaire sur certaines données. Ceci fait partie de mon code pour tester de nouvelles données en utilisant une configuration de modèle et des poids 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)
1
tauseef_CuriousGuy

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))
0
Thomas Decaux