LeanderK:

I thought torchvision.datasets applies them per epoch (or batch)?


Yes, with torchvision.transforms you can apply different random data augmentations like RandomHorizontalFlip, RandomResizedCrop, … and you can also combine a list of such transformations together using torchvision.transforms.Compose(transforms).
https://pytorch.org/docs/stable/torchvision/transforms.html?highlight=randomhorizontalflip#torchvision.transforms.RandomHorizontalFlip 32
But note that all these transformations need the data to be in PIL Image format. So, you can first convert your numpy array to PIL Image, and then apply the transformations. At the end, you torchvision.transforms.ToTensor() will convert the final image to a Tensor.