Python 如何将predict_生成器与ImageDataGenerator一起使用?

Python 如何将predict_生成器与ImageDataGenerator一起使用?,python,machine-learning,keras,deep-learning,generator,Python,Machine Learning,Keras,Deep Learning,Generator,我对凯拉斯很陌生。我训练了一个模型,并希望预测存储在子文件夹中的一些图像(如用于训练)。为了进行测试,我想预测7个类(子文件夹)中的2个图像。下面的测试生成器看到了14幅图像,但我得到了196个预测。错在哪里?非常感谢 test_datagen = ImageDataGenerator(rescale=1./255) test_generator = test_datagen.flow_from_directory( test_dir, target_size=

我对凯拉斯很陌生。我训练了一个模型,并希望预测存储在子文件夹中的一些图像(如用于训练)。为了进行测试,我想预测7个类(子文件夹)中的2个图像。下面的测试生成器看到了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)

问题在于
nb_样本
包含在
predict_生成器
中,该生成器将创建14批14幅图像

14*14 = 196
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))

您可以将
flow\u from\u directory
batch\u size
的值从默认值(即
batch\u size=32
)更改为
batch\u size=1
。然后将
predict\u generator
步骤设置为测试图像的总数。大概是这样的:

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)

生成器中的默认批处理大小为32。如果您想对所有nb_样本中的每个样本进行1次预测,您应该使用
批量大小来划分nb_样本。因此,当批处理大小为7时,14张图像只需14/7=2个步骤

14*14 = 196
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))

使用拟合和预测,TensorFlow现在支持生成器的这两种方法。

以防万一将来有人发现自己在这里想知道为什么使用model.predict和model.predictor得到的准确度分数不同。只需使用model.predict_生成器选项,而不必考虑降级警告。model.predict与发电机一起使用时似乎存在问题。

谢谢djk。不幸的是,如果我删除这个参数,我会得到一个错误:predict_generator()至少接受3个参数(给定2个),因此,如果我添加model.predict_generator(test_generator,1),我会分析32个图像(默认批量大小)。这意味着我应该添加nb\u samples=len(文件名)/批大小模型。预测\u生成器(test\u生成器,nb\u samples)是否正确?我发现很难找到这方面的好文档。最好的问候,MarioCan有人告诉我,在使用
predict\u生成器
进行预测后,我如何计算准确度?任何想知道模型是否在测试集上给出随机预测的人:别忘了设置
shuffle=False
。它在OP的帖子中,但有时您可能会忘记它,默认值为True。@MohitMotwani,为了计算准确性,您可以使用
模型。评估(测试数据,目标数据)
或使用生成器
模型。评估(测试生成器…)
。但是不要忘记在model.fit()中为度量添加“准确性”。是否有可能单独预测每个样本以测量推断时间?如果我有一个大小为101的测试数据集,默认批次大小为32,该怎么办。如果我设置steps=101//32=3。我得到了96个预测,但最后5个样本没有预测。如果我设置steps=101//32+1=4。将发生错误。那我该怎么办?对于101个步骤,使用批次大小=1?这不是一个优雅的解决方案,如果我的测试数据集大小为6234547呢?使用1的批处理大小将非常低效。只需一句评论:@Ioannis的答案是一个更一般的答案,它考虑了批处理大小。注:predict_generator(…)接受num_of_steps作为第二个参数,该参数是批量大小上的测试样本数。Num_of_steps定义停止生成器的条件,否则它将继续生成或加载一批图像。