【问题标题】:Keras - Predict on model after learning sentiment data throws errorsKeras - 在学习情绪数据后预测模型会引发错误
【发布时间】:2017-02-18 08:45:35
【问题描述】:

我的问题是通过使用 tensorflow 后端的 keras 中的预测方法获得结果。但首先是一个简短的介绍。

我正在使用

  • Python 2.7.12
  • Keras==1.2.1
  • numpy==1.12.0
  • 张量流==0.12.1

我在这些文档中创建了一个卷积神经网络:https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html

我用 11842 条准备好的推特文本训练了网络。唯一的个人变化是我有 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 ### Prints: (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) [[节点: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 is not in [0, 13480) [[节点: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 工作并返回一个具有以下形状的 numpy 数组 (11842, 3) Code - pastbin

整个错误输出:Error output - pastbin

如果需要一些额外的信息,我会更新问题...

【问题讨论】:

  • 你做了什么样的转换从data_train得到x_train、x_val?
  • 学习模型?我在上面的链接中这样做了。我将所有文本打乱,然后将它们与“VALIDATION_SPLIT”(对我来说是 0.19)相乘,然后在训练和验证数据之间拆分它们。或者你的意思是我如何让它们成为一个 numpy 数组?

标签: python machine-learning tensorflow keras


【解决方案1】:

问题是经过训练的模型在嵌入矩阵中找不到单词。这意味着我使用不同的词汇进行训练和预测。因为固定的词汇表,我需要相同的词汇表来训练和新数据。

一般来说,我只需要从以下位置修复标记器:

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)

【讨论】:

    【解决方案2】:

    也许它试图访问索引为 13608 的 [0, 13480) 列表(这显然不起作用)。其他人也有类似的问题:https://github.com/tensorflow/tensorflow/issues/2734 似乎他试图访问索引为 10535 的词汇表 [0, 10000)。

    【讨论】:

    • 使用 print (len(data_train)), print (type(data_train)) 我得到以下输出 11842, ... 对于适用于火车的预测数据集。我为实时 twitter 数据集得到相同的输出......只有长度更高 46962, ...所以它应该是一个 nparray
    猜你喜欢
    • 2022-06-16
    • 2020-02-09
    • 2020-05-27
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2019-10-19
    相关资源
    最近更新 更多