Got your point regarding .eval() mode, but I fear that shuffle is changing my validation results. My code snippet looks something like this
for each epoch:
    self.model.train()
    # train data for each batch
    self.model.eval()
    # validate

my validation results differ by 20-25% with the change of the shuffle parameter. Note that I am changing the shuffle parameter of my validation data loader (not train data loader).
While debugging I stumbled upon this StackOverflow 17 question and surprisingly OP’s 2nd scenario prefectly fits mine. When i turn off the shuffle (on my validation data loader) there is a huge difference between my train and validation accuracy(train being 95% while validation stuck on 71%) , but the difference vanishes as the shuffle turned on.