Estoy teniendo el siguiente error.
Traceback (most recent call last): File "main.py", line 63, in <module> 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__() callTengo 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 ejecuto 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 son 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 Module , vemos en la cadena de documentación un ejemplo de derivación de 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 al init de Module de 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 anidados se agregarán a un OrderedDict _modules (inicializado en nn.Module.__init__ ) Ver fuente (L69)
Si no se llama a nn.Module.__init__ ( self._modules sería igual a None ), al intentar agregar un módulo, generará un error (no se puede agregar ninguna clave a None ). Ver fuente (L540-544)
Inspirado en el documento :
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._modulesEsto suele ocurrir cuando no se ha llamado al init de la superclase. En este caso, uno debe comenzar su clase de red neuronal con la llamada super.__init__() . El código se vería así:
class QuestionClassifier(nn.Module): def __init__(self, dictionary, embeddings_index, max_seq_length, args): super().__init__()La llamada de inicio de este super debe estar dentro del código de inicio de esta clase.