Keras, como faço para prever depois de treinar uma modelo?


87

Estou brincando com o conjunto de dados reuters-example e ele funciona bem (meu modelo foi treinado). Li sobre como salvar um modelo, para poder carregá-lo mais tarde para usar novamente. Mas como faço para usar este modelo salvo para prever um novo texto? Eu uso models.predict()?

Devo preparar este texto de uma forma especial?

Eu tentei com

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)

Mas eu sempre 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'

Você tem alguma recomendação sobre como fazer previsões com um modelo treinado?

Respostas:


61

model.predict()espera que o primeiro parâmetro seja uma matriz numpy. Você fornece uma lista, que não tem o shapeatributo de um array numpy.

Caso contrário, seu código parece bom, exceto que você não está fazendo nada com a previsão. Certifique-se de armazená-lo em uma variável, por exemplo:

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

existe uma maneira de imprimir apenas top k usando a probabilidade softmax de keras?
donald

1
@donald Sim. Basta adicionar 'top_k_categorical_accuracy' às suas métricas em fit().
nemo


5

Você deve usar o mesmo Tokenizer usado para construir seu modelo!

Caso contrário, isso dará um vetor diferente para cada palavra.

Então, estou usando:

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

model.predict(np.array(tokens))

1

Treinei uma rede neural em Keras para realizar regressão não linear em alguns dados. Esta é uma parte do meu código para testar novos dados usando a configuração e os pesos do modelo salvos anteriormente.

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

Você pode simplesmente "chamar" seu modelo com uma matriz da forma correta:

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

Exemplo 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]])>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.