If your Dataset's __getitem__ looks like this:
def __getitem__(self, index):
      x = Image.open(self.paths[index])  # load lazily
      return x

then each call to __getitem__ will load a single sample using the index.
The Dataloader takes care of loading enough samples to create a whole batch specified by batch_size.