Hi,
The problem is that nn.Sequential, gets all the modules in your network and pass your input in .forward to all of those modules. Currently, self.criterion is a module and it is the first module. if you print this code, you get list of modules:
net = Network()
list(net.modules())

# [Network(
#   (criterion): NLLLoss()
# ), NLLLoss()]

which as you can see, nn.Sequential pass x to NLLLoss and obviously this module needs a target too! And after this, next module will be optimizer which does not accept any input at all.
The problem is you are defining a full model(loss, optimizer, etc) by extending nn.Sequential which is not correct. If you want to extend nn.Sequential you need to follow its own patterns.
Here is an instance:
class Network(nn.Sequential):
    def __init__(self, layers=(nn.Conv2d(1, 3, 3), nn.Conv2d(3, 10, 3)), act='relu'):
        super(Network, self).__init__()
        self.init_modules(layers, act)
    def init_modules(self, layers, act):
        for idx, module in enumerate(layers):
            self.add_module(str(idx), module)
            if act == 'relu':
                self.add_module(str(idx)+'act', nn.ReLU())
        

Module list in this case:
[Network(
   (0): Conv2d(1, 3, kernel_size=(3, 3), stride=(1, 1))
   (0act): ReLU()
   (1): Conv2d(3, 10, kernel_size=(3, 3), stride=(1, 1))
   (1act): ReLU()
 ),
 Conv2d(1, 3, kernel_size=(3, 3), stride=(1, 1)),
 ReLU(),
 Conv2d(3, 10, kernel_size=(3, 3), stride=(1, 1)),
 ReLU()]

PS. note the line with super, you have to use same structure. super(MyModule, self).__init__()
Bests