DataLoaders get_x vs item_tfms

How should I choose whether to use get_x vs item_tfms? In the examples for image classification, Resize is passed via item_tfms:

db = DataBlock(
    blocks = (ImageBlock, CategoryBlock),
    get_items = get_image_files,
    get_y = get_label,
    item_tfms = Resize(224)
)

It seems that passing it via get_x also works:

birds = DataBlock(
    blocks = (ImageBlock, CategoryBlock),
    get_items = get_image_files,
    get_x = Resize(224),
    get_y = get_label
)

I see that the transforms will be applied at different stages but what’s the practical difference between these approaches? When should I transform my inputs with get_x and when should I use item_tfms?

I think one difference is that item_tfms creates two functions (more precisely two lists of functions) under the hood: one that is applied to the validation dataset and one to the training dataset. So I doubt whether item_tfms and get_x can be used interchangeably

get_items() is generally used to obtain the files as a whole, while get_x and get_y are used to obtain input & target labels separately i.e if they require separate ways of reading the files.

You can refer Lesson 3 - Multi-Label Classification | walkwithfastai this article which demos the various datablock getters for input & target