使用LSTM层在Keras中进行预测

时间:2018-09-17 21:50:36

标签: python keras lstm rnn

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

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

结果数据看起来像size (num_samples, 140)的2D数组。样本数量约为3万。

这是我的神经网络上的定义

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。因此,没有在任何测试样品上设置标签。

Sample output from mdl.predict()

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

但是,如果我运行mdl.evaluate(),则模型拟合期间的准确度将达到0.93。

我在做什么错了?

2 个答案:

答案 0 :(得分:0)

如果您的班级不平衡,那么准确度就不是一个好的指标。成像您的数据集包含80%的0和20%的1。您可以创建一个在所有情况下均返回0的模型,其准确度等于80%。

答案 1 :(得分:0)

@将输出每个类别的概率

model.predict(test_x, batch_size=100)将输出最可能的类别/实际预测

因此,从您的问题来看,您似乎想要model.predict_classes(test_x, batch_size=100)。运行model.predict_classes以查看所有可用功能。

如果要从dir(model)输出生成model.predict_classes输出,请执行

model.predict

这是什么,它遍历了每一行,例如,下面是model.predict的输出,其中包含class1,class2,class3的概率

[[0.15,0.73,0.02],#注意概率总和= 1

[0.23,0.33,0.44]

找到最大概率的索引,即0.73的索引为1,并创建该索引的数组,因此输出为[1、2]。

pred = model.predict() pred_classes_output = pred.argmax(axis=1) model.evaluate进行检查。

我也希望您能理解,如果您的样本存在固有的偏倚,比如说您有90个1级,10个2级,那么只要预测1即可获得90%的准确度,即基线准确度。