Thanks for the code!
Could you remove the last softmax call from your model?
nn.CrossEntropyLoss expects logits as the model’s output, since internally F.log_softmax and nn.NLLLoss will be used.
Your model should thus just return self.fc3(x) without and non-linearity.