model.eval() disables the dropout and uses the internal running stats in all batchnorm layers (also custom modules might change their behavior using the self.training flag, which is changed by calling eval()).
If your validation loss and predictions are bad, this might point to bad running estimates in the batchnorm layers. You would see it if e.g. the training and validation data are not processed in the same way (especially the normalization) or if they are sampled from another data domain and thus have different statistics.
To counter this effect, you could play around with the momentum of the batchnorm layers to smooth the statistics a bit.
Also, if not already used, you should shuffle the training dataset to avoid adding a bias for the stats updates based on the last samples in your training dataset.