This is an implementation of the mixup algorithm.
Mixup [1] is a kind of image augmentation methods, which augments training data by mixing-up both of training images and labels by linear interpolation with weight lambda:
X = lambda * X1 + (1 - lambda) * X2, y = lambda * y1 + (1 - lambda) * y2, where lambda is drawn from the Beta distribution Be(alpha, alpha), and alpha is a hyperparameter.
Please check mixup_generator.py for implementation details.
Get MixupGenerator:
from mixup_generator import MixupGenerator training_generator = MixupGenerator(x_train, y_train, batch_size=batch_size, alpha=0.2)()x_train: training images (#images x h x w x c)y_train: labels as one hot vectors (#images x #classes or list of #images x #classes for multi-task training)batch_size: batch sizealpha: hyper parameter;lambdais drawn from the beta distributionBe(alpha, alpha).
Get mixed training batch:
x, y = next(generator)Please refer to test_mixup.ipynb to see how it works.
It is very easy to use MixupGenerator in training if you are using Keras; Get MixupGenerator, and then fit model by fit_generator:
model.fit_generator(generator=training_generator, steps_per_epoch=x_train.shape[0] // batch_size, validation_data=(x_test, y_test), epochs=epochs, verbose=1, callbacks=callbacks)Please refer to cifar10_resnet.py for complete example, which is imported from official Keras examples.
The MixupGenerator can be combined with keras.preprocessing.image.ImageDataGenerator for further image augmentation:
datagen = ImageDataGenerator( width_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True) training_generator = MixupGenerator(x_train, y_train, batch_size=batch_size, alpha=0.2, datagen=datagen)()In this case, the mixed-up training images are further augmented by ImageDataGenerator.
Random Erasing [2] is a kind of image augmentation methods for convolutional neural networks (CNN). It tries to regularize models using training images that are randomly masked with random values.
Please refer to this repository for the details of algorithm and its implementation.
Mixup can be combined with Random Erasing via ImageDataGenerator by:
from random_eraser import get_random_eraser datagen = ImageDataGenerator( width_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True, preprocessing_function=get_random_eraser(v_l=0, v_h=255)) generator = MixupGenerator(x_train, y_train, alpha=1.0, datagen=datagen)()The augmented images become like this:
(!Only a single trial)
Without mixup:
Test loss: 0.862150103855 Test accuracy: 0.8978 With mixup alpha = 0.2:
Test loss: 0.510702615929 Test accuracy: 0.9117 With mixup alpha = 0.5:
Test loss: 0.48489781661 Test accuracy: 0.9181 With mixup alpha = 1.0:
Test loss: 0.493033925915 Test accuracy: 0.9167 [1] H. Zhang, M. Cisse, Y. N. Dauphin, and D. Lopez-Paz, "mixup: Beyond Empirical Risk Minimization," in arXiv:1710.09412, 2017.
[2] Z. Zhong, L. Zheng, G. Kang, S. Li, and Y. Yang, "Random Erasing Data Augmentation," in arXiv:1708.04896, 2017.


