Pytorch has a lot less convenience for building „every-day“ architectures.
Initialization is more refined in keras. This is hugh. E.g. initialze in keras an copy weights, biases to pytorch via a mini wrapper function.
The optimizer may work slightly differently.
Use the same code to measure results, e.g. sklearn scores/measures. GPU metrics code can be funky. If you have label imbalances etc make sure to use the right measure. Micro, macro, roc etc.
Normalization: if you dont normalize and get better performance, then it may be that unormalized features with large values are important features. Or your network is underparameterized — then small value fearures get ignored, which in that case can be good. This happens quite often in practice.
Check that they original data split is not contaminated with train samples in the test set. This also happens a lot, e.g. with various versions of sklearn and gets fixed over time.
Lastly. Pytorch (and others) has its bugs. E.g. MSE was broken for a year or other losses like multilabelsoftmargin are still not easy to use — work other than expected.
So always check the submodules to work as expected.
Love pytorch but it is younger.