我目前正在训练Keras模型进行分类(20个班级),文本分类问题。
当我使用训练和验证集训练模型时,会得到如下输出:
Epoch 19/20 59500/59500 [=============================]-22秒 371us / step-损耗: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 [==============================]-1秒66us / step 10500/10500 [==============================]-1秒80us / step Keras得分:0.9546093940734863 测试仪精度:49.58%
我希望分数是完全相同的,因为它是相同的数据,相同的度量以及所有内容。标签被编码为一热向量,因此在精度计算中为argmax。
我当然想获得模型在训练中所具有的性能,我只是对为什么性能甚至不一样感到困惑。尽管我了解该模型可能不正确,但我不理解该模型为什么预测的结果与计算分数所用的结果不同(指标是准确性)。
使用以下方法训练模型:
history = classifier.fit(X_train, train_labels,
epochs=20,
verbose=True,
validation_data=(X_test, valid_labels),
batch_size=20)
谢谢!
编辑
模型返回的预测不是一个热门向量。它们是我认为可以预测的整数。
答案 0 :(得分:0)
您的预测(N,20)是否为numpy数组?从您的标签y
进行一次热编码的判断来看,我希望样本x
的预测也是每个类别都有概率的矢量(在这种情况下为20)。
如果是这种情况;
accuracy_score(np.argmax(valid_labels, axis=1), np.argmax(predictions, axis=1))
应该可以解决问题。
答案 1 :(得分:0)
我发现损失函数对于多类分类问题是不正确的。在为训练提供的验证数据和我自己的测试集上进行更改和重新训练均产生一致的结果。