首页 > 解决方案 > 使用 LSTM 层在 Keras 中进行预测

问题描述

我正在尝试使用 Keras 构建文本标签(多标签)神经网络。

我已经建立了一个大约 2000 个单词的字典,并将训练样本编码为长度为 140 的单词索引序列(带有填充)。

由于结果数据看起来像一个 2D 数组size (num_samples, 140)。样本数量约为 30k。

这是我的神经网络的定义

mdl = Sequential()
mdl.add(Embedding((vocab_len + 1), 300, input_length=140))
mdl.add(LSTM(100))

mdl.add(Dense(train_y.shape[1], activation="sigmoid"))

mdl.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=["accuracy"])

history = mdl.fit(train_x, train_y, epochs=4, verbose=1, validation_data=(valid_x, valid_y), batch_size=100)

在训练期间,Keras 在训练和验证数据上的准确率都在 0.93 左右。这看起来很有希望。

但是当我尝试对测试数据调用预测时

pred_y = mdl.predict(test_x, batch_size=100)

我得到一个数组,其中所有行看起来都相同,并且都小于 0.5。因此,没有在任何测试样本上设置标签。

mdl.predict() 的示例输出

如果我predict()在刚刚用于训练模型的相同训练数据上运行,则会观察到相同的行为。

但是如果我运行,mdl.evaluate()我会得到与模型拟合过程中显示的相同的 0.93 精度。

我究竟做错了什么?

标签: pythonkeraslstmrnn

解决方案


如果您的类不平衡,则准确性不是很好的指标。成像您有一个包含 80% 的 0 和 20% 的 1 的数据集。您可以创建一个在所有情况下都返回 0 的模型,其准确率将等于 80%。


推荐阅读