AttributeError:在Module .__ init __()调用之前无法分配模块

时间:2017-03-28 21:50:44

标签: python pytorch

我收到以下错误。

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__() call

我有一个课程如下。

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)

所以,当我运行以下行时:

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

我得到了上面提到的错误。在此,EmbeddingLayerEncoderRNN是由我编写的类,其继承nn.moduleQuestionClassifier

我在这里做错了什么?

3 个答案:

答案 0 :(得分:7)

查看pytorch source code for Module,我们在docstring中看到了从Module派生的示例包括:

 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)

所以你可能想在派生类中以相同的方式调用Module的init:

super(QuestionClassifier, self).__init__()

答案 1 :(得分:0)

Pytorch跟踪您将在自定义模块中编写的子模块(import { ... } @angular/coreconv1)。在引擎盖下,将自动构建与您的模型相对应的图形。

嵌套的模块将添加到OrderedDict conv2(在_modules中初始化),请参见source(L69)

如果未调用nn.Module.__init__nn.Module.__init__等于self._modules),则在尝试添加模块时,将引发错误(无法将密钥添加到{{1 }})。看到 source(L540-544)

灵感来自doc

None

答案 2 :(得分:0)

通常在未调用超类的init时发生。在这种情况下,应使用 super .__ init __()调用来启动其神经网络类。代码如下:

class QuestionClassifier(nn.Module):
    def __init__(self, dictionary, embeddings_index, max_seq_length, args):
       super().__init__()

此超级的init调用应在此类的init代码内。