ConvNet data augmentation, full pass or random samples? I'm adding data augmentation on a FCN model, right now I'm doing simple flips, random zoom and random rotations.
At the moment for each sample I do all the four transforms (vertical flip, horizontal flip, zoom, rotation) separately for each epoch.
So the dataset grows five times bigger, each epoch is about five times slower, but I get converge way faster than before.
Another alternative I've seen is to keep each epoch the same size of the original training set and for each example randomly sample from the augmented transform pool. I didn't try this approach but I guess it learns in more epochs in about the same time as the other one.
Is there a best practice about this?
The main problem, if I may call it so, I'm seeing with this approach is I get ugly metrics and loss plots with fewer data points as the number of epochs to convergence is small.
 A: I think both are equally valid approaches, however, in practice, I have rarely seen your approach of doing all augmentations per epoch. I think most people just go with sampling from the augmentations.
Here are some reasons that might be the case


*

*Compatibility with augmentations such as random noise -- because looping over all possible random noise would be painful. Sampling also scales better when you just have a lot of transformations.

*It's much easier to make the mistake of not shuffling properly if you try to do all augmentations. For example, the following sequence, where the data is randomly shuffled, but the transforms are applied in order, is incorrect:
data1_transform1, data3_transform1, data_2_transform1, data1_transform2, data3_transform2, data_2_transform2,  data1_transform3, data3_transform3, data_2_transform3
It would also not be ideal, but probably not too harmful, to do something like:
data1_transform1, data1_transform3, data1_transform2, data3_transform2, data3_transform1, data3_transform3, data2_transform3, data2_transform1, data2_transform2
As you can see, getting the shuffling exactly right is a bit tricky.


*Comparability to training without augmentation. It doesn't make sense to compare a network trained with augmentation for 1 epoch with a network which has been trained without augmentation for 1 epoch if the one which has, has also been through 5x as many iterations. So keeping the number of iterations per epoch constant is important for comparison.

