While the former defines nn.Module
classes, the latter uses a functional (stateless) approach.
To dig a bit deeper: nn.Modules
are defined as Python classes and have attributes, e.g. a nn.Conv2d
module will have some internal attributes like self.weight
. F.conv2d
however just defines the operation and needs all arguments to be passed (including the weights and bias). Internally the modules will usually call their functional counterpart in the forward
method somewhere.
That being said, it depends also on your coding style how you would like to work with your modules/parameters etc. While modules might be good enough in most use cases, the functional API might give you additional flexibility which is needed sometimes.
We’ve have a similar discussion recently in this thread.