如何在使用 ImageDataGenerator 时获得基本事实和相应的分数

Posted

技术标签:

【中文标题】如何在使用 ImageDataGenerator 时获得基本事实和相应的分数【英文标题】:How to get the ground truths and the corresponding scores while using ImageDataGenerator 【发布时间】:2019-09-14 21:35:09 【问题描述】:

我是 Keras 的新手,我使用 roc 曲线和我的测试数据集来评估我的模型的质量(该模型是使用功能 api 完成的,在我的代码 sn-中被标识为“model” p)。

我打算使用 ROC 曲线(使用 scikit-learn 中的 roc_curve)。

例子:

fpr_keras, tpr_keras, thresholds_keras = roc_curve(y_true,y_scores)

为了做到这一点,如文档所述,我需要真正的二进制标签(示例中为y_true)和目标分数(示例中为y_scores)。

但我不知道如何从测试中获取所有真正的二进制标签ImageDataGeneratortest_generator(见下文)返回一个 DirectoryIterator)。

而且我不知道如何用model.predict_generator得到对应的目标分数(它返回一个批量大小的数组)

现在我的代码看起来像这样(总结):

from keras.preprocessing.image import ImageDataGenerator
from sklearn.metrics import roc_curve

height=150
width=150
batch_size=16

test_datagen = ImageDataGenerator(rescale=1./255)

test_generator = test_datagen.flow_from_directory(
        'data/test',
        target_size=(height, width),
        batch_size=batch_size,
        class_mode='binary')

y_pred_keras = model.predict_generator(test_generator,1).ravel()

【问题讨论】:

【参考方案1】:

获取您正在使用的标签值test_generator.classes。它提供了用于测试的所有标签。有关更多信息,您可以查看此code。它显示了一个使用 keras 数据flow_from_directory 进行混淆矩阵评估的示例。现在您可以使用test_generator.classes 中的y_pred_kerasy_pred_true 来创建ROC 曲线。

【讨论】:

我试过你的链接,我收到一个错误expected activation_5 to have shape (5,) but got array with shape (2,)。当我通过修改模型来修复它时,会出现另一个错误:(第 77 行)ValueError: Found input variables with inconsistent numbers of samples: [10, 190]test_generator.classes 也是一个 int,所以我不能做类似的事情:``` fpr_keras, tpr_keras, thresholds_keras = roc_curve(test_generator.classes, y_pred) ``` 您找到创建曲线的解决方案了吗!?谢谢。

以上是关于如何在使用 ImageDataGenerator 时获得基本事实和相应的分数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用批处理为大型数据集拟合 Keras ImageDataGenerator

在机器学习中,改组如何与 ImageDataGenerator 一起工作?

使用 ImageDataGenerator 进行 Keras 数据增强(您的输入没有数据)

如何从大型 .h5 数据集中批量读取数据,使用 ImageDataGenerator 和 model.fit 进行预处理,所有这些都不会耗尽内存?

ImageDataGenerator:如何将第 4 维添加到 numpy 数组?

给定从图像名称到类标签的映射,如何使用keras ImageDataGenerator flow_from_directory?