Hi everyone,
doing a bit of research on the forum and looking at various codes I got a doubt about implementing an MLP in pytorch.
In particular, I have often seen two implementations for an MLP. The first is simply:
from torch import nn

MLP = nn.Linear(
            in_features=... ,
            out_features=...,
        )

the second one also includes the activation function and the dropout:
from torch import nn

class MLP(nn.Module):
    def __init__(self, in_features, out_features, activation='ReLU', dropout=0.3):
        super(MLP, self).__init__()
        self.layers = nn.Sequential()
        act_fn = getattr(nn, activation)
      
        self.layers.add_module('fc_{}'.format(i),nn.Linear(in_features, out_features))
        self.layers.add_module('{}_{}'.format(activation, i), act_fn())
        self.layers.add_module('dropout_{}'.format(i), nn.Dropout(dropout))
        
        in_features = out_features

    def forward(self, x):
        return self.layers(x)

my question is whether these two implementations, under the hood, are the same or not. By default, does pytorch’s Linear layer already have its own (default) activation function and a (default) dropout?
If they weren’t the same, as I suspect, what is the most faithful implementation for an MLP?
Thank you all!