我收到以下错误。
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
和EncoderRNN
是由我编写的类,其继承nn.module
类QuestionClassifier
。
我在这里做错了什么?
答案 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/core
,conv1
)。在引擎盖下,将自动构建与您的模型相对应的图形。
嵌套的模块将添加到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代码内。