我的问题是使用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)