The functional API is stateless, i.e. you can use the functions directly passing all necessary arguments.
On the other side torchvision.transforms are mostly classes which have some default parameters or which store the parameters you’ve provided.
For example using Normalize, you could define the class and use it with the passed parameters. Using the functional approach, you would have to pass the parameters every time:
transform = transforms.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))
data = transform(data)

# Functional
data = TF.normalize(data, mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))

You can use the functional API to transform your data and target with the same random values, e.g. for random cropping:
i, j, h, w = transforms.RandomCrop.get_params(image, output_size=(512, 512))
image = TF.crop(image, i, j, h, w)
mask = TF.crop(mask, i, j, h, w)

Sometimes it’s also just your coding style.
While some find the functional API to be cleaner, some prefer the classes.