简体   繁体   English

Keras,我如何在训练模型后进行预测?

[英]Keras, how do I predict after I trained a model?

I'm playing with the reuters-example dataset and it runs fine (my model is trained).我正在使用 reuters-example 数据集,它运行良好(我的模型经过训练)。 I read about how to save a model, so I could load it later to use again.我阅读了有关如何保存模型的信息,以便稍后加载以再次使用。 But how do I use this saved model to predict a new text?但是我如何使用这个保存的模型来预测新文本? Do I use models.predict() ?我使用models.predict()吗?

Do I have to prepare this text in a special way?我必须以特殊的方式准备这篇课文吗?

I tried it with我试过了

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)

But I always get但我总是得到

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

Do you have any recommendations as to how to make predictions with a trained model?您对如何使用训练有素的模型进行预测有什么建议吗?

model.predict() expects the first parameter to be a numpy array. model.predict()期望第一个参数是一个 numpy 数组。 You supply a list, which does not have the shape attribute a numpy array has.您提供一个列表,该列表不具有 numpy 数组具有的shape属性。

Otherwise your code looks fine, except that you are doing nothing with the prediction.否则您的代码看起来不错,只是您没有对预测做任何事情。 Make sure you store it in a variable, for example like this:确保将其存储在变量中,例如:

prediction = model.predict(np.array(tk.texts_to_sequences(text)))
print(prediction)
model.predict_classes(<numpy_array>)

示例https://gist.github.com/alexcpn/0683bb940cae510cf84d5976c1652abd

You must use the same Tokenizer you used to build your model!您必须使用用于构建模型的相同 Tokenizer!

Else this will give different vector to each word.否则,这将为每个单词提供不同的向量。

Then, I am using:然后,我正在使用:

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

model.predict(np.array(tokens))

You can just "call" your model with an array of the correct shape:您可以使用正确形状的数组“调用”您的模型:

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

Full example:完整示例:

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

I trained a neural network in Keras to perform non linear regression on some data.我在 Keras 中训练了一个神经网络来对一些数据执行非线性回归。 This is some part of my code for testing on new data using previously saved model configuration and weights.这是我使用以前保存的模型配置和权重测试新数据的代码的一部分。

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)

Your can use your tokenizer and pad sequencing for a new piece of text.您可以使用分词器和填充排序来获取新文本。 This is followed by model prediction.接下来是模型预测。 This will return the prediction as a numpy array plus the label itself.这会将预测返回为一个 numpy 数组加上标签本身。

For example:例如:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM