Keras, ¿cómo puedo predecir después de entrenar un modelo?

87

Estoy jugando con el conjunto de datos de ejemplo de Reuters y funciona bien (mi modelo está entrenado). Leí sobre cómo guardar un modelo, para poder cargarlo más tarde para usarlo nuevamente. Pero, ¿cómo utilizo este modelo guardado para predecir un nuevo texto? Lo uso models.predict()?

¿Tengo que preparar este texto de forma especial?

Lo probé 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)

Pero siempre consigo

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

¿Tiene alguna recomendación sobre cómo hacer predicciones con un modelo entrenado?

ben
fuente

Respuestas:

61

model.predict()espera que el primer parámetro sea una matriz numpy. Proporciona una lista, que no tiene el shapeatributo que tiene una matriz numpy.

De lo contrario, su código se ve bien, excepto que no está haciendo nada con la predicción. Asegúrese de almacenarlo en una variable, por ejemplo, como esta:

prediction = model.predict(np.array(tk.texts_to_sequences(text)))
print(prediction)
nemo
fuente
¿Hay alguna manera de imprimir solo la parte superior k usando la probabilidad keras softmax?
donald
1
@donald Sí. Simplemente agregue 'top_k_categorical_accuracy' a sus métricas en fit().
nemo
5

¡Debes usar el mismo Tokenizer que usaste para construir tu modelo!

De lo contrario, esto le dará un vector diferente a cada palabra.

Entonces, estoy usando:

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

model.predict(np.array(tokens))
Thomas Decaux
fuente
1

Entrené una red neuronal en Keras para realizar una regresión no lineal en algunos datos. Esta es una parte de mi código para probar nuevos datos utilizando la configuración y los pesos del modelo guardados previamente.

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
fuente
1

Puede simplemente "llamar" a su modelo con una matriz de la forma correcta:

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

Ejemplo 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]])>
Nicolás Gervais
fuente