The bug is probably in



 ngap_wei_Tham:

self._linear_block(main, ‘linear_0’, 1633, 120)


You have the wrong size for the linear block, it should probably not be 16*3*3, but something else.
Also, you are overcomplicating the definition of your model. If your model is just a sequential, you can construct it with an OrderedDict, so that you don’t need to create a Net class for it.
Something like
def _conv_block(l, name, inp_filter_size, out_filter_size, kernal_size):
    l['{}-{}.{}.conv'.format(name, inp_filter_size, out_filter_size)] =  
                    nn.Conv2d(inp_filter_size, out_filter_size, kernal_size, 1, 1))
    l['{}-{}.batchnorm'.format(name, out_filter_size)] = nn.BatchNorm2d(out_filter_size))
    l['{}-{}.relu'.format(name, out_filter_size)] = nn.ReLU())

def _linear_block(l, name, inp_filter_size, out_filter_size):
        l[('{}-{}.{}.linear'.format(name, inp_filter_size, out_filter_size)] = 
                        nn.Linear(inp_filter_size, out_filter_size))
        l[('{}-{}'.format(name, out_filter_size)] = nn.ReLU())

l = OrderedDict()
_conv_block(l, 'conv_0', 3, 6, 5)
l['max_pool_0_2_2'] = nn.MaxPool2d(2,2)
...

model = nn.Sequential(l)

And that can still be cleaned up a bit