我目前正在训练一个用于分类(20个类别)的Keras模型,解决文本分类问题。
当我用训练集和验证集训练模型时,得到的输出如下:
第19/20个周期 59500/59500 [==============================] – 22秒 371微秒/步 – 损失: 0.0038 – 准确率: 0.9989 – 验证损失: 0.6645 – 验证准确率: 0.9550
表明验证准确率非常高。之后,当我调用模型来评估分数(在同一个验证集上)时,我得到:
from sklearn.metrics import accuracy_scorepredictions = classifier.predict(X_test)print(f"Keras Score: {classifier.score(X_test, valid_labels)}")print(f"测试集上的准确率: {100 * accuracy_score(np.argmax(valid_labels, axis=1), predictions):.2f}%")
得到的结果是:
10500/10500 [==============================] – 1秒 66微秒/步 10500/10500 [==============================] – 1秒 80微秒/步 Keras Score: 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)
谢谢!
编辑
模型返回的预测不是独热向量。它们是一个整数,我认为这是预测的类别。
回答:
我发现对于多类分类问题,损失函数是错误的。更改损失函数并重新训练后,在训练提供的验证数据和我的测试集上都得到了一致的结果。