It looks like the second F.relu on self.hidden2 is not needed.
Also, in the Keras training code you are using softmax as the last activation, while in PyTorch you are using log_softmax. Could you change both and have a look, if the training is approx. equal?