What I know, or at least what I think that I know

When instantiating one of the VisionDataset from torchvision.datasets, such as the MNIST, a transform argument can be provided which can be built using  torchvision.transforms.Compose with a list of transformations.
If the argument transformation is provided to the particular chosen VisionDataset, the transform don’t seem to be used immediately by the object. But instead, it seems to be used only when we have a torch.utils.data.DataLoader iterating through the dataset.
I noticed from the documentation page on transforms 1 that there are transforms that work on top of PIL objects, Tensor objects and both.
It seems that only Tensor objects can be transferred to the gpu, not PIL objects.

Questions I have

Is it the case that it is better to have the transforms working only on Tensors instead of working on PIL objects in terms of execution time?
Would those transforms using Tensor be operated in the GPU and the ones using PIL only on CPU?
Is one type of input for the transform better than the other? If so, why having two types of transform?
Additionally, I am setting the the pin_memory to True. I am not sure what is a batch of a custom type, but I don’t think that this is my case, so I am assuming that the pin_memory is actually taking effect and making the transfer memory -> gpu_memory faster. Is that the case? If most of the out of the box network examples fall in this categories, why pin_memory is default to False. Am I missing something on here?

Thanks.