【问题标题】:Getting true labels for keras predictions获取 keras 预测的真实标签
【发布时间】:2020-03-07 19:45:05
【问题描述】:

我有一个用于图像分类的标准 CNN,使用以下生成器来获取数据集:

generator = validation_image_generator.flow_from_directory(batch_size=BATCH_SIZE,
                                                           directory=val_dir,
                                                           shuffle=False,
                                                           target_size=(100,100),
                                                           class_mode='categorical')

我可以很容易地得到预测的标签:

predictions = model.predict(dataset)

现在我想获取所有预测的(原始)真实标签图像,以与预测相同的顺序进行比较。我确信这些信息很容易存储在某个地方,但我一直找不到。

【问题讨论】:

  • 真正的标签是什么意思?这个函数给你在训练集中使用的标签(通常是数字)!所以你知道每个标签背后的实际含义。
  • 我的意思是数据集中该图像的原始标签,而不是模型的预测。
  • 你能发布更多的代码而不是上面的一行吗?例如。您定义生成器的部分。这样我们就能更好地帮助您。
  • @Tinu 你是对的!我已经添加了生成器代码。

标签: python tensorflow keras conv-neural-network


【解决方案1】:

您必须从数据生成器中获取图像并将它们提供给 model.predict。 如果 image_gen 是您的 ImageDataGenerator ,那么您可以使用:

X,y = image_gen.next()
prediction = model.predict(X)

现在 X 是您的图像(例如,X[0] 是第一张图像,X[1] 是第二张图像,依此类推),y 是它们对应的标签,预测是您的模型为每张图像输出的结果。

这将提供来自 ImageDataGenerator 的批次并显示 X、y 和预测。要在整个 epoch 中运行它,您必须使用 for 循环:

for step in range(step_per_epoch):
    X, y = image_gen.next()
    prediction = model.predict(X)

step_per_epoch 应该是 dataset_size/batch_size。

但请记住 ImageDataGenerators 随机工作。因此,如果您有 100 张图像并且批量大小为 10,如果您从 ImageDataGenerator 中获取 10 个批次,您可能会看到一些图像两次,而您不会看到其他一些图像。

【讨论】:

  • 请注意,这应该在 for 循环中运行以获得整个批次的 epoch
  • 太好了,我只有一个问题,使用这种方法我只能得到与生成器批次一样多的元素,也就是说,我受限于批次大小。我想得到所有的图像。非常感谢您的帮助!
  • @Pythonless 对不起,我认为那部分很简单。我更新了我的答案。
【解决方案2】:

您希望同时拥有真实的标签、图像和预测。这可以与documentation 中的示例类似:

# here's a more "manual" example
for e in range(epochs):
    print('Epoch', e)
    batches = 0
    for x_batch, y_batch in datagen.flow(x_train, y_train, batch_size=32):
        model.fit(x_batch, y_batch)
        batches += 1
        if batches >= len(x_train) / 32:
            # we need to break the loop by hand because
            # the generator loops indefinitely
            break

上面是一个训练循环,你可以调整它来轻松获得一个测试评估循环,例如:

for x_val, y_val in generator().flow_from_directoy(...):
    y_pred = model.predict(x_val)
    score = your_score_func(y_pred,y_val)

【讨论】:

    猜你喜欢
    • 2019-05-25
    • 2017-09-15
    • 2019-03-03
    • 2022-06-17
    • 2020-05-11
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多