首页 > 解决方案 > Keras,得分与预测

问题描述

我目前正在为分类(20 类)、文本分类问题训练 Keras 模型。

当我使用训练和验证集训练模型时,我得到如下输出:

纪元 19/20 59500/59500 [===============================] - 22s 371us/步 - 损失:0.0038 - 准确度:0.9989 - val_loss:0.6645 - val_accuracy:0.9550

建议非常好的验证准确性。之后,当我调用我的模型来评估分数时(在同一个验证集上),我得到:

from sklearn.metrics import accuracy_score
predictions = classifier.predict(X_test)
print(f"Keras Score: {classifier.score(X_test, valid_labels)}")
print(f"Accuracy on test set: {100 * accuracy_score(np.argmax(valid_labels, axis=1),    predictions):.2f}%")

产量:

10500/10500 [===============================] - 1s 66us/步 10500/10500 [====== ========================] - 1s 80us/step Keras 分数:0.9546093940734863 测试集准确率:49.58%

我希望分数完全相同,因为它是相同的数据,相同的度量和一切。标签被编码为 one-hot 向量,因此是准确度计算中的 argmax。

我当然希望实现模型在训练时似乎具有的性能,我只是对为什么性能甚至不一样感到困惑。虽然我理解模型可能不正确,但我不明白为什么模型预测的东西与它用来计算分数的东西不同(指标是准确性)。

该模型经过以下训练:

history = classifier.fit(X_train, train_labels,
                    epochs=20,
                    verbose=True,
                    validation_data=(X_test, valid_labels),
                    batch_size=20)

谢谢!

编辑

模型返回的预测不是单热向量。它们是一个整数,我相信它是预测的类。

标签: pythonmachine-learningkeras

解决方案


你的预测 (N,20) 是 numpy 数组吗?从您的标签来看y, 是一次性编码的,我希望对样本x的预测也是一个具有每个类别概率的向量(在这种情况下为 20)。

如果是这种情况;

accuracy_score(np.argmax(valid_labels, axis=1), np.argmax(predictions, axis=1))

应该做的伎俩。


推荐阅读