Keras, come faccio a prevedere dopo aver addestrato un modello?


88

Sto giocando con il set di dati di esempio di reuters e funziona bene (il mio modello è addestrato). Ho letto di come salvare un modello, così potrei caricarlo più tardi per usarlo di nuovo. Ma come si usa questo modello salvato per prevedere un nuovo testo? Lo uso models.predict()?

Devo preparare questo testo in modo speciale?

L'ho provato con

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)

Ma ottengo sempre

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

Hai qualche consiglio su come fare previsioni con un modello addestrato?

Risposte:


61

model.predict()si aspetta che il primo parametro sia un array numpy. shapeFornisci un elenco, che non ha l' attributo di un array numpy.

Altrimenti il ​​tuo codice sembra a posto, tranne per il fatto che non stai facendo nulla con la previsione. Assicurati di memorizzarlo in una variabile, ad esempio in questo modo:

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

c'è un modo per stampare solo il top k usando la probabilità keras softmax?
donald il

1
@donald Sì. Aggiungi semplicemente "top_k_categorical_accuracy" alle tue metriche in fit().
nemo


5

Devi usare lo stesso Tokenizer che hai usato per costruire il tuo modello!

Altrimenti questo darà un vettore diverso a ciascuna parola.

Quindi, sto usando:

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

model.predict(np.array(tokens))

1

Ho addestrato una rete neurale a Keras per eseguire la regressione non lineare su alcuni dati. Questa è una parte del mio codice per testare nuovi dati utilizzando la configurazione e i pesi del modello salvati in precedenza.

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

Puoi semplicemente "chiamare" il tuo modello con un array della forma corretta:

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

Esempio completo:

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

0

Puoi usare il tokenizer e la sequenza dei pad per un nuovo pezzo di testo. Questo è seguito dalla previsione del modello. Ciò restituirà la previsione come un array numpy più l'etichetta stessa.

Per esempio:

new_complaint = ['Your service is not good']
seq = tokenizer.texts_to_sequences(new_complaint)
padded = pad_sequences(seq, maxlen=maxlen)
pred = model.predict(padded)
print(pred, labels[np.argmax(pred)])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.