Keras, bagaimana cara memprediksi setelah saya melatih model?

88

Saya bermain dengan dataset contoh reuters dan itu berjalan dengan baik (model saya dilatih). Saya membaca tentang cara menyimpan model, sehingga saya dapat memuatnya nanti untuk digunakan lagi. Tapi bagaimana cara menggunakan model tersimpan ini untuk memprediksi teks baru? Apakah saya menggunakan models.predict()?

Apakah saya harus menyiapkan teks ini dengan cara khusus?

Saya mencobanya dengan

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)

Tapi saya selalu mendapatkannya

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

Apakah Anda memiliki rekomendasi tentang cara membuat prediksi dengan model terlatih?

ben
sumber

Jawaban:

61

model.predict()mengharapkan parameter pertama menjadi array numpy. Anda memberikan daftar, yang tidak memiliki shapeatribut yang dimiliki oleh numpy array.

Jika tidak, kode Anda terlihat baik-baik saja, kecuali Anda tidak melakukan apa pun dengan prediksi. Pastikan Anda menyimpannya dalam variabel, misalnya seperti ini:

prediction = model.predict(np.array(tk.texts_to_sequences(text)))
print(prediction)
nemo
sumber
adakah cara untuk mencetak hanya k atas dengan probabilitas keras softmax?
donald
1
@ Donald Ya. Cukup tambahkan 'top_k_categorical_accuracy' ke metrik Anda di fit().
nemo
5

Anda harus menggunakan Tokenizer yang sama dengan yang Anda gunakan untuk membuat model!

Jika tidak, ini akan memberikan vektor yang berbeda untuk setiap kata.

Kemudian, saya menggunakan:

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

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

Saya melatih jaringan saraf di Keras untuk melakukan regresi non linier pada beberapa data. Ini adalah beberapa bagian dari kode saya untuk menguji data baru menggunakan konfigurasi dan bobot model yang disimpan sebelumnya.

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

Anda cukup "memanggil" model Anda dengan array dengan bentuk yang benar:

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

Contoh lengkap:

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]])>
Nicolas Gervais
sumber
0

Anda dapat menggunakan tokenizer dan pengurutan pad untuk bagian teks baru. Ini diikuti dengan prediksi model. Ini akan mengembalikan prediksi sebagai larik numpy ditambah label itu sendiri.

Sebagai contoh:

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