Some differences are:

your module approach uses affine batchnorm layers, which update their running stats and use the affine parameters (weight and bias), while your functional approach resets the running stats and doesn’t use the trainable affine parameters.
you are not using the training argument for batchnorm and dropout layers. You won’t be able to use these layers in their evaluation mode, which would be used via model.eval() in the first approach