Keras – 在学习情感数据后使用模型进行预测时出现错误

我的问题是使用TensorFlow后端的Keras中的predict方法获取结果时遇到的问题。首先简单介绍一下。

我使用的是

  • Python 2.7.12
  • Keras==1.2.1
  • numpy==1.12.0
  • tensorflow==0.12.1

我创建了一个卷积神经网络,参考了以下文档:https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html

我用11842条预处理的Twitter文本训练了网络。唯一个性化的更改是我的结果有3种可能性(0,1,2)。我在以下代码行中定义了这一点:

preds = Dense(3, activation='softmax')(x)

因此,fit方法可以正常工作,我的准确率在88-92%之间。

model_fit = model.fit(x_train, y_train, validation_data=(x_val, y_val), nb_epoch=10, batch_size=128)

学习过程结束后,我将模型保存为.h5格式(也正常工作)。

现在我尝试加载模型并用它们进行预测。第一个例子(trained_model)是用我用来训练的相同数据完成的……因为我想对比它们。第二个例子(trained_model_2)是用新的Twitter文本(我之前收集的)完成的。

trained_model = load_model("trained_model.h5")prediction_result = trained_model.predict(data_train, batch_size=128)print prediction_result.shape ### 打印: (11842, 3)trained_model_2 = load_model("trained_model.h5")prediction_result_2 = trained_model_2.predict(data_predict, batch_size=128)

为了比较训练数据集和“实时/新”数据集:

print data_train.shape # (11842, 1000)

print data_predict.shape # (46962, 1000)

两者都是dtype=int32类型

以下代码行引发了第一个错误:

prediction_result_2 = trained_model_2.predict(data_predict, batch_size=128)

tensorflow.python.framework.errors_impl.InvalidArgumentError: indices[0,999] = 13608 不在 [0, 13480) 范围内 [[Node: Gather_1 = Gather[Tindices=DT_INT32, Tparams=DT_FLOAT, validate_indices=true, _device=”/job:localhost/replica:0/task:0/cpu:0″](embedding_1_W_1/read, _recv_input_1_1_0)]]

以下代码行引发了第二个错误:

trained_model_2 = load_model("trained_model.h5")

InvalidArgumentError (参见上面的跟踪信息): indices[0,999] = 13608 不在 [0, 13480) 范围内 [[Node: Gather_1 = Gather[Tindices=DT_INT32, Tparams=DT_FLOAT, validate_indices=true, _device=”/job:localhost/replica:0/task:0/cpu:0″](embedding_1_W_1/read, _recv_input_1_1_0)]]

编辑我创建的方法的源代码。方法“trainModule”仅用于训练网络/保存它。方法“predict_sentiment”用于我的预测测试。第一个prediction_results可以正常工作,并返回一个形状为(11842, 3)的numpy数组代码 – pastbin

完整的错误输出:错误输出 – pastbin

如果需要更多信息,我会更新这个问题…


回答:

问题在于训练的模型无法在嵌入矩阵中找到单词。这意味着我在训练和预测时使用了不同的词汇表。由于词汇表是固定的,我需要在训练和新数据中使用相同的词汇表。

总的来说,我只需要修复tokenizer,从:

tokenizer_predict = Tokenizer(nb_words=MAX_NB_WORDS)tokenizer_predict.fit_on_texts(texts_predict)sequence_predict = tokenizer_predict.texts_to_sequences(predict_data)

改为:

tokenizer_predict = Tokenizer(nb_words=MAX_NB_WORDS)tokenizer_predict.fit_on_texts(texts_train)sequence_predict = tokenizer_predict.texts_to_sequences(predict_data)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注