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

新手上路,请多包涵

我收到以下错误。

 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)

我收到上述错误。在这里, EmbeddingLayer QuestionClassifier EncoderRNN 我是由我写的类,是我写的类 - 继承 nn.module

我在这里做错了什么?

原文由 Wasi Ahmad 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

查看 pytorchModule 代码,我们在文档字符串中看到一个从 Module includes:81– 派生的示例

 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 的初始化:

 super(QuestionClassifier, self).__init__()

原文由 juanpa.arrivillaga 发布,翻译遵循 CC BY-SA 3.0 许可协议

Pytorch 跟踪您将在自定义模块中编写的子模块( conv1conv2 )。在引擎盖下,与您的模型对应的图表是自动构建的。

嵌套模块将被添加到 OrderedDict _modules (在 nn.Module.__init__ 中初始化)见 源代码(L69)

如果 nn.Module.__init__ 没有被调用( self._modules 等于 None ),当尝试添加一个模块时(没有键可以添加一个错误,它会引发错误 None )。见 来源(L540-544)

灵感来自 文档

  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

原文由 x0s 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题