Mario Kreutzfeldt
Mario Kreutzfeldt

Reputation: 559

How to use predict_generator with ImageDataGenerator?

I'm very new to Keras. I trained a model and would like to predict some images stored in subfolders (like for training). For testing, I want to predict 2 images from 7 classes (subfolders). The test_generator below sees 14 images, but I get 196 predictions. Where is the mistake? Thanks a lot!

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)

Upvotes: 24

Views: 83633

Answers (5)

Chiebukar
Chiebukar

Reputation: 93

Just incase someone finds himself here in future wondering why the accuracy score gotten from using model.predict and model.predictor differs. just use the model.predict_generator option regardless of the depracation warning. There seems to be an issue with model.predict when used with generators.

Upvotes: 0

K. Mitra
K. Mitra

Reputation: 613

Use fit and predict, TensorFlow now supports both the methods with generators.

Upvotes: 2

Matin H
Matin H

Reputation: 900

You can change the value of batch_size in flow_from_directory from default value (which is batch_size=32 ) to batch_size=1. Then set the steps of predict_generator to the total number of your test images. Something like this:

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)

Upvotes: 42

Ioannis Nasios
Ioannis Nasios

Reputation: 8527

Default batch_size in generator is 32. If you want to make 1 prediction for every sample of total nb_samples you should devide your nb_samples with the batch_size. Thus with a batch_size of 7 you only need 14/7=2 steps for your 14 images

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))

Upvotes: 10

DJK
DJK

Reputation: 9264

The problem is the inclusion of nb_samples in the predict_generator which is creating 14 batches of 14 images

14*14 = 196

Upvotes: 5

Related Questions