I just noticed an odd thing. It does not make any difference whether I actually run the line
dual_encoder.load_state_dict(torch.load('SAVED_MODEL.pt')) or not.
encoder_model = model_and_training.Encoder(
        input_size = model_and_training.emb_dim,
        hidden_size = 200,
        vocab_size = model_and_training.vocab_len)

dual_encoder = model_and_training.DualEncoder(encoder_model)

#dual_encoder.load_state_dict(torch.load('SAVED_MODEL.pt')) 

dual_encoder.eval()

gives me the same validation performance as when I uncomment it…