This is just what broadcasting is good for (None below inserts a singleton dimension for broadcasting, : uses all of a given dimension. One could use unsqueeze or view, but I like this to align things.)
T0, T1 = torch.randn(2, 3, 4, 4)

interps = torch.tensor([0.0, 0.25, 0.5, 0.75, 1.0])

T3 = T0[:, None, :, :] * (1 - interps[None, :, None, None]) + T1[:, None, :, :] * interps[None, :, None, None]

or equivalently
T3 = torch.lerp(T0[:, None, :, :], T1[:, None, :, :], interps[None, :, None, None])

The latter can be a bit faster (useful if your computation is bottlenecked on these operations), but torch.lerp is a tad exotic and so chances are that people trying to understand the code will have to look up what it does.
Best regards
Thomas