AttributeError: cannot assign module before Module.__init__() call
Looking at the pytorch
source code for Module
, we see in the docstring an example of deriving from Module
includes:
class Model(nn.Module):
def __init__(self):
super(Model, self).__init__()
self.conv1 = nn.Conv2d(1, 20, 5)
self.conv2 = nn.Conv2d(20, 20, 5)
So you probably want to call Module
's init the same way in your derived class:
super(QuestionClassifier, self).__init__()
Pytorch keeps track of the submodules(conv1
, conv2
) you will write in your custom Module. Under the hood, the graph corresponding to your Model is automatically built.
The nested Modules will be added to an OrderedDict _modules
(initialized in nn.Module.__init__
) See source(L69)
If nn.Module.__init__
is not called (self._modules
would equal to None
), when trying to add a Module, it will raise an error (no key can be added to None
). See
source(L540-544)
Inspired from the doc:
class CustomModule(nn.Module):
def __init__(self):
super(CustomModule, self).__init__() # Initialize self._modules as OrderedDict
self.conv1 = nn.Conv2d(1, 20, 5) # Add key conv1 to self._modules
self.conv2 = nn.Conv2d(20, 20, 5) # Add key conv2 to self._modules
This usually happens when super class's init has not been called. In this case one should start their Neural network class with super.__init__() call. The code would look like this:
class QuestionClassifier(nn.Module):
def __init__(self, dictionary, embeddings_index, max_seq_length, args):
super().__init__()
This super's init call should be within this class's init code.