AttributeError: no se puede asignar el módulo antes de la llamada del módulo .__ init __ ()

Estoy teniendo el siguiente error.

Traceback (most recent call last): File "main.py", line 63, in  question_classifier = QuestionClassifier(corpus.dictionary, embeddings_index, corpus.max_sent_length, args) File "/net/if5/wua4nw/wasi/academic/research_with_prof_chang/projects/question_answering/duplicate_question_detection/source/question_classifier.py", line 26, in __init__ self.embedding = EmbeddingLayer(len(dictionary), args.emsize, args.dropout) File "/if5/wua4nw/anaconda3/lib/python3.5/site-packages/torch/nn/modules/module.py", line 255, in __setattr__ "cannot assign module before Module.__init__() call") AttributeError: cannot assign module before Module.__init__() call 

Tengo una clase de la siguiente manera.

 class QuestionClassifier(nn.Module): def __init__(self, dictionary, embeddings_index, max_seq_length, args): self.embedding = EmbeddingLayer(len(dictionary), args.emsize, args.dropout) self.encoder = EncoderRNN(args.emsize, args.nhid, args.model, args.bidirection, args.nlayers, args.dropout) self.drop = nn.Dropout(args.dropout) 

Entonces, cuando corro la siguiente línea:

 question_classifier = QuestionClassifier(corpus.dictionary, embeddings_index, corpus.max_sent_length, args) 

Me sale el error mencionado anteriormente. Aquí, EmbeddingLayer y EncoderRNN es una clase escrita por mí que hereda nn.module como la clase QuestionClassifier .

¿Qué estoy haciendo mal aquí?

Mirando el código fuente de pytorch para el Module , vemos en la cadena de documentos que un ejemplo de derivación del Module incluye:

  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) 

Así que probablemente quieras llamar a init del Module la misma manera en tu clase derivada:

 super(QuestionClassifier, self).__init__() 

Pytorch realiza un seguimiento de los submódulos ( conv1 , conv2 ) que escribirá en su Módulo personalizado. Debajo del capó, el gráfico correspondiente a su modelo se construye automáticamente.

Los módulos nesteds se agregarán a los módulos de _modules (inicializados en nn.Module.__init__ ) Ver fuente (L69)

Si no se llama nn.Module.__init__ ( self._modules sería igual a None ), al intentar agregar un Módulo, se generará un error (no se puede agregar ninguna clave a None ). Ver fuente (L540-544)

Inspirado en el 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