Hi, when we define a network architecture, we might happened to see the following case which seems have the same effect:
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.block = nn.Sequential(
nn.Conv2d(3, 16, kernel_size=3, padding=1),
nn.BatchNorm2d(16),
nn.ReLU(),
nn.MaxPool2d(kernel_size=4, stride=4)
)
self.fc = nn.Linear(64 * 16, 10)
def forward(self, x):
x = self.block(x)
x = x.view(x.size(0), -1)
x = self.fc(x)
return x
class NewNet(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv = nn.Conv2d(3, 16, kernel_size=3, padding=1)
self.bn = nn.BatchNorm2d(16)
self.fc = nn.Linear(64 * 16, 10)
def forward(self, x):
x = self.bn(self.conv(x))
x = F.max_pool2d(F.relu(x), 4, stride=4)
x = x.view(x.size(0), -1)
x = self.fc(x)
return x
My question is: what is the difference between the functional interface and the module sequential list interface? How will we choose between them and in what situation should we choose the functionality case?