如何使用 predict_generator 对 Keras 中的流式测试数据进行预测?

数据挖掘 机器学习 Python 深度学习 喀拉斯 混淆矩阵
2021-09-16 00:09:03

Keras 关于从头开始训练 convnets 的博客中,代码仅显示了在训练和验证数据上运行的网络。测试数据呢?验证数据是否与测试数据相同(我认为不是)。如果在与训练和验证文件夹相似的行上有一个单独的测试文件夹,我们如何获得测试数据的混淆矩阵。我知道我们必须使用 scikit learn 或其他一些包来执行此操作,但是我如何获得测试数据的类明智概率?我希望将其用于混淆矩阵。

3个回答

要从测试数据中获取混淆矩阵,您应该执行两个步骤:

  1. 对测试数据进行预测

例如,用于model.predict_generator预测来自测试生成器的前 2000 个概率。

generator = datagen.flow_from_directory(
        'data/test',
        target_size=(150, 150),
        batch_size=16,
        class_mode=None,  # only data, no labels
        shuffle=False)  # keep data in same order as labels

probabilities = model.predict_generator(generator, 2000)
  1. 根据标签预测计算混淆矩阵

例如,将概率与分别有 1000 只猫和 1000 只狗的情况进行比较。

from sklearn.metrics import confusion_matrix

y_true = np.array([0] * 1000 + [1] * 1000)
y_pred = probabilities > 0.5

confusion_matrix(y_true, y_pred)

关于测试和验证数据的附加说明

Keras 文档使用三组不同的数据:训练数据、验证数据和测试数据。训练数据用于优化模型参数。验证数据用于选择元参数,例如时期数。在使用最优元参数优化模型后,测试数据用于获得对模型性能的公平估计。

这是我尝试并为我工作的一些代码:

pred= model.predict_generator(validation_generator, nb_validation_samples // batch_size)
predicted_class_indices=np.argmax(pred,axis=1)
labels=(validation_generator.class_indices)
labels2=dict((v,k) for k,v in labels.items())
predictions=[labels2[k] for k in predicted_class_indices]
print(predicted_class_indices)
print(labels)
print(predictions)

然后你可以使用:

print (confusion matrix(predicted_class_indices,labels)

确保shuffle=False在您的测试生成器中使用(在我的情况下它是验证生成器)并validation_generator.reset()在做出预测之前使用重置它。

对于混淆矩阵,您必须使用 sklearn 包。我不认为 Keras 可以提供混淆矩阵。对于测试集上的预测值,只需调用 model.predict() 方法来生成测试集的预测。输出值的类型取决于您的模型类型,即离散或概率。