All these look good.

Moving the .eval outside of the no_grad() block won’t change anything.
If you use batchnorm, you might want to double check how the model behaves without the model.eval(). The saved statistics for the eval mode might not be very good in the middle of the training when the model changes a lot.
You can check that the network initialization is what you expect. That could explain the difference with Keras.