It’s expected that the results differ if you pass the same input to the model in training and evaluation mode.
In the former case, the batchnorm layers will normalize the input activation using the batch statistics and will update the running stats with it, while the running stats will be used to normalize the activation in the latter case.
Could you compare the output in the training and evaluation script using model.eval() only?