passing a single image through a BatchNorm network is a terrible idea, especially in training mode.
Your batch statistics end up being just image channel statistics.
What’s happening with running_mean/running_std?

During training, this layer keeps a running estimate of its computed mean and variance. The running sum is kept with a default momentum of 0.1.

i.e. it’s updated as: running_mean = 0.9 * running_mean + 0.1 * current_mean
I’d suggest that you iterate over your modules and set all the BatchNorm layers to .eval(), like this:
m.apply(lambda x: x.eval() if 'BatchNorm' in str(type(x)) else False)