You could use grid_sample for bilinear interpolation.
I created a small example for this use case:
# Create fake image
image = torch.zeros(1, 3, 24, 24)
image[0, :, 6:18, 6:18] = 1.

# Create grid
out_size = 12
x = torch.linspace(-1, 1, out_size).view(-1, 1).repeat(1, out_size)
y = torch.linspace(-1, 1, out_size).repeat(out_size, 1)
grid = torch.cat((x.unsqueeze(2), y.unsqueeze(2)), 2)
grid.unsqueeze_(0)

image_small = F.grid_sample(image, grid)

import matplotlib.pyplot as plt
plt.imshow(image[0].permute(1, 2, 0).numpy())
plt.imshow(image_small[0].permute(1, 2, 0).numpy())

Also, you could try AvgPool2d 341 if that fits your use case.