To load data lazily, you would have to move the actual loading into Dataset.__getitem__, while you are apparently preloading the complete dataset in the __init__ method:
data=[np.load(join(fake, array)) for array in os.listdir(fake)]
data.extend([np.load(join(real, array)) for array in os.listdir(real)])

While this is easy to do, if you are dealing with samples stored in unique files (e.g. images), you might need to implement more logic, e.g. if each numpy array contains multiple samples.
I.e. you could load each numpy array and return it completely. This approach would basically multiply your batch_size (passed to the DataLoader) with the number of samples per loaded array.
Also, the shuffle option would only shuffle the numpy files, not the samples directly.