Keras, làm thế nào để tôi dự đoán sau khi tôi đào tạo một người mẫu?


87

Tôi đang chơi với tập dữ liệu ví dụ về bộ định tuyến và nó chạy tốt (mô hình của tôi đã được đào tạo). Tôi đã đọc về cách lưu mô hình, vì vậy tôi có thể tải mô hình đó sau để sử dụng lại. Nhưng làm cách nào để sử dụng mô hình đã lưu này để dự đoán một văn bản mới? Tôi có sử dụng models.predict()không?

Tôi có phải chuẩn bị văn bản này theo một cách đặc biệt không?

Tôi đã thử nó với

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)

Nhưng tôi luôn nhận được

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

Bạn có bất kỳ khuyến nghị nào về cách đưa ra dự đoán với một mô hình được đào tạo không?

Câu trả lời:


61

model.predict()mong đợi tham số đầu tiên là một mảng numpy. Bạn cung cấp một danh sách, danh sách này không có shapethuộc tính mà một mảng numpy có.

Nếu không thì mã của bạn trông vẫn ổn, ngoại trừ việc bạn không làm gì với dự đoán. Đảm bảo rằng bạn lưu trữ nó trong một biến, ví dụ như sau:

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

có cách nào để in ra k đầu bằng cách sử dụng xác suất softmax của keras không?
donald

1
@donald Có. Chỉ cần thêm 'top_k_categorical_accuracy' vào chỉ số của bạn trong fit().
nemo


5

Bạn phải sử dụng cùng một Tokenizer mà bạn đã sử dụng để xây dựng mô hình của mình!

Nếu không, điều này sẽ cung cấp các vector khác nhau cho mỗi từ.

Sau đó, tôi đang sử dụng:

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

model.predict(np.array(tokens))

1

Tôi đã đào tạo một mạng nơ ron ở Keras để thực hiện hồi quy phi tuyến tính trên một số dữ liệu. Đây là một số phần mã của tôi để thử nghiệm trên dữ liệu mới bằng cách sử dụng cấu hình và trọng số mô hình đã lưu trước đó.

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

Bạn chỉ có thể "gọi" mô hình của mình bằng một mảng có hình dạng chính xác:

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

Ví dụ đầy đủ:

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]])>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.