Your code looks fine.
Apparently the kernels of F.adaptive_max_pool2d overlap for odd input sizes:
a = torch.zeros(1, 1, 5, 5)
a[0, 0, 2, 4] = 1.0
F.adaptive_max_pool2d(a, (2, 2))
> tensor([[[[ 0.,  1.],
          [ 0.,  1.]]]])

I’m not sure this is wanted behavior.