Keras, bir model eğittikten sonra nasıl tahmin ederim?


88

Reuters örnek veri setiyle oynuyorum ve iyi çalışıyor (modelim eğitilmiş). Bir modeli nasıl kaydedeceğimi okudum, böylece daha sonra tekrar kullanmak için yükleyebilirim. Ancak bu kaydedilmiş modeli yeni bir metni tahmin etmek için nasıl kullanırım? Kullanıyor muyum models.predict()?

Bu metni özel bir şekilde hazırlamam gerekiyor mu?

İle denedim

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)

Ama her zaman anlıyorum

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

Eğitimli bir modelle nasıl tahmin yapılacağına dair herhangi bir öneriniz var mı?

Yanıtlar:


61

model.predict()ilk parametrenin bir numpy dizisi olmasını bekler. shapeBir numpy dizisinin sahip olduğu özniteliğe sahip olmayan bir liste sağlarsınız.

Aksi takdirde, tahminde hiçbir şey yapmamanız dışında kodunuz iyi görünür. Bunu bir değişkende sakladığınızdan emin olun, örneğin şöyle:

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

keras softmax olasılığını kullanarak yalnızca üst k yazdırmanın bir yolu var mı?
donald

1
@donald Evet. İçindeki metriklerinize "top_k_categorical_accuracy" ekleyin fit().
nemo


5

Modelinizi oluşturmak için kullandığınız aynı Tokenizer'ı kullanmalısınız!

Aksi takdirde bu, her kelimeye farklı vektör verecektir.

Sonra kullanıyorum:

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

model.predict(np.array(tokens))

1

Bazı veriler üzerinde doğrusal olmayan regresyon gerçekleştirmek için Keras'ta bir sinir ağını eğittim. Bu, önceden kaydedilmiş model yapılandırmasını ve ağırlıkları kullanarak yeni veriler üzerinde test etme kodumun bir parçasıdır.

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

Modelinizi doğru şekle sahip bir dizi ile "çağırabilirsiniz":

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

Tam örnek:

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

Yeni bir metin parçası için jetonlaştırıcınızı ve ped sıralamanızı kullanabilirsiniz. Bunu model tahmini takip eder. Bu, tahmini bir numpy dizisi artı etiketin kendisi olarak döndürecektir.

Örneğin:

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)])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.