【问题标题】:How to use predict_generator with ImageDataGenerator?如何将 predict_generator 与 ImageDataGenerator 一起使用?
【发布时间】:2018-01-30 02:13:40
【问题描述】:

我对 Keras 很陌生。我训练了一个模型,并希望预测存储在子文件夹中的一些图像(例如用于训练)。为了测试,我想从 7 个类(子文件夹)中预测 2 个图像。下面的 test_generator 看到了 14 个图像,但我得到了 196 个预测。错误在哪里?非常感谢!

test_datagen = ImageDataGenerator(rescale=1./255)

test_generator = test_datagen.flow_from_directory(
        test_dir,
        target_size=(200, 200),
        color_mode="rgb",
        shuffle = "false",
        class_mode='categorical')

filenames = test_generator.filenames
nb_samples = len(filenames)

predict = model.predict_generator(test_generator,nb_samples)

【问题讨论】:

  • 只是评论:@Ioannis 的答案是一个更一般的答案,它考虑了 batch_size。注意:predict_generator(...) 接受 num_of_steps 作为第二个参数,它是超过批量大小的测试样本数。 Num_of_steps 定义了停止生成器的标准,否则它将继续生成或加载一批图像。

标签: python machine-learning keras deep-learning generator


【解决方案1】:

您可以将flow_from_directory 中的batch_size 的值从默认值(即batch_size=32)更改为batch_size=1。然后将predict_generatorsteps 设置为测试图像的总数。像这样的:

test_datagen = ImageDataGenerator(rescale=1./255)

test_generator = test_datagen.flow_from_directory(
        test_dir,
        target_size=(200, 200),
        color_mode="rgb",
        shuffle = False,
        class_mode='categorical',
        batch_size=1)

filenames = test_generator.filenames
nb_samples = len(filenames)

predict = model.predict_generator(test_generator,steps = nb_samples)

【讨论】:

  • 有人能告诉我使用predict_generator预测后如何计算准确率吗?
  • 任何想知道模型是否对您的测试集进行随机预测的人:不要忘记设置shuffle = False。它在 OP 的帖子中,但有时您可能会忘记它,默认值为 True。
  • @MohitMotwani,为了计算准确性,您可以使用model.evaluate(test_data, target_data) 或使用生成器model.evaluate(test_generator, ...),而不是手动计算。但不要忘记在 model.fit() 中为指标添加“准确度”
  • 是否有可能分别预测每个样本以测量推理时间?
  • 谢谢。我实际上缺少步骤参数。这解决了我的问题。
【解决方案2】:

生成器中的默认 batch_size 为 32。如果您想对总 nb_samples 的每个样本进行 1 次预测,您应该使用 batch_size 分配您的 nb_samples。因此,batch_size 为 7,您的 14 张图片只需要 14/7=2 步

desired_batch_size=7

test_datagen = ImageDataGenerator(rescale=1./255)

test_generator = test_datagen.flow_from_directory(
        test_dir,
        target_size=(200, 200),
        color_mode="rgb",
        shuffle = False,
        class_mode='categorical',
        batch_size=desired_batch_size)

filenames = test_generator.filenames
nb_samples = len(filenames)

predict = model.predict_generator(test_generator,steps = 
                                   np.ceil(nb_samples/desired_batch_size))

【讨论】:

  • 如果我有一个大小为 101 的测试数据集,默认 batch_size = 32。如果我设置 steps = 101 // 32 = 3。我得到了 96 个预测,但最后 5 个样本没有预测.如果我设置steps = 101 // 32 + 1 = 4.会发生错误。所以我该怎么做?使用 batch_size = 1,101 步?这不是一个优雅的解决方案,如果我的测试数据集大小为 6234547,该怎么办?使用 1 的批量大小会非常低效。
【解决方案3】:

问题在于 predict_generator 中包含 nb_samples,它创建了 14 批 14 张图像

14*14 = 196

【讨论】:

  • 谢谢 djk。不幸的是,如果我删除这个参数,我会得到一个错误:predict_generator() 需要至少 3 个参数(给定 2 个)
  • 所以,如果我添加 model.predict_generator(test_generator,1) 我会分析 32 张图像(默认批量大小)。这意味着我应该添加 nb_samples = len(filenames) / batch_size model.predict_generator(test_generator,nb_samples) 对吗?我发现很难找到这方面的好文档。最好的问候,马里奥
【解决方案4】:

使用 fit 和 predict,TensorFlow 现在支持使用生成器的这两种方法。

【讨论】:

    【解决方案5】:

    以防将来有人发现自己在这里想知道为什么使用 model.predict 和 model.predictor 得到的准确度分数不同。只需使用 model.predict_generator 选项,无论弃用警告如何。与生成器一起使用时,model.predict 似乎存在问题。

    【讨论】:

      猜你喜欢
      • 2021-04-20
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      相关资源
      最近更新 更多