Keras Data Augmentation Parameters
Asked Answered
J

2

5

I read some materials about data augmentation in Keras but it is still a bit vague for me. Is there any parameter to control the the number of images created from each input image in the data augmentation step? In this example, I can't see any parameter that controls the number of images created from each image.

For example, in the below code I can have a parameter (num_imgs) for controlling the number of images created from each input image and stored in a folder called preview; but in the real-time data augmentation there isn't any parameter for this purpose.

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
num_imgs = 20
datagen = ImageDataGenerator(
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest')

img = load_img('data/train/cats/cat.0.jpg')  # this is a PIL image
x = img_to_array(img)  # this is a Numpy array with shape (3, 150, 150)
x = x.reshape((1,) + x.shape)  # this is a Numpy array with shape (1, 3, 150, 150)

# the .flow() command below generates batches of randomly transformed images
# and saves the results to the `preview/` directory
i = 0
for batch in datagen.flow(x, batch_size=1,
                          save_to_dir='preview', save_prefix='cat', save_format='jpeg'):
    i += 1
    if i > num_imgs:
        break  # otherwise the generator would loop indefinitely
Jarib answered 15/12, 2016 at 22:42 Comment(0)
P
10

Data augmentation works as follows: at each learning epoch transformations with randomly selected parameters within the specified range are applied to all original images in the training set. After an epoch is completed, i.e. after having exposed a learning algorithm to the entire set of training data, the next learning epoch is started and training data is once again augmented by applying specified transformations to the original training data.

In that way the number of times each image is augmented is equal to the number of learning epochs. Recall form the example that you linked:

# Fit the model on the batches generated by datagen.flow().
model.fit_generator(datagen.flow(X_train, Y_train,
                    batch_size=batch_size),
                    samples_per_epoch=X_train.shape[0],
                    nb_epoch=nb_epoch,
                    validation_data=(X_test, Y_test))

Here datagen object will expose the training set to the model nb_epoch times, so each image would be augmented nb_epoch times. In this way the learning algorithm almost never sees two exactly the same training examples, because at each epoch training examples are randomly transformed.

Phan answered 16/12, 2016 at 9:9 Comment(4)
Thank you for your helpful comment. So, if I have totally 1000 images, in each epoch 1000 new images are generated from the original images and feed in to the model for training. Then, in next epoch 1000 new images are generated from the original images and feed into the model for training, and so on. So, it is possible that the model never see the original data, right?Jarib
Another approach would be generating and storing new images, and then training our model using that. For example, if I generate 10 images from each input image, then I will have 10,000 new images. So, totally I will have 11,000 images for training. Which one of these approaches is better?Jarib
Yes, you are right, it is possible that the model might never see the original data. The more transformations are applied the less the probability that the model will see the original data. The range of transformations parameters affects also that probability. The approach you suggested in the second comment seems also reasonable. It is hard to say which one is better, I would try both alternatives and pick the one that yields the best result!Phan
Just want to add that the random parameters are generated for each image.Orthodontia
Y
3

Here is basically how it works, it only generates one image for each input image, after all the input images has been generated once, it will start over again.

In your example, because there's only one input image in total, it will repeatedly generate different versions of that image until there're twenty.

You can take a look at the source code here https://github.com/fchollet/keras/blob/master/keras/preprocessing/image.py

Yearning answered 16/12, 2016 at 3:13 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.