AttributeError: cannot assign module before Module.__init__() call
AttributeError: cannot assign module before Module.__init__() call
我收到以下错误。
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如下。
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
是我写的class,继承了nn.module
,就像QuestionClassifier
class.
我做错了什么?
查看 pytorch
source code for Module
,我们在文档字符串中看到从 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)
所以您可能想在派生的 class:
中以相同的方式调用 Module
的初始化
super(QuestionClassifier, self).__init__()
Pytorch 跟踪您将在自定义模块中编写的子模块(conv1
、conv2
)。在引擎盖下,与您的模型对应的图表是自动构建的。
嵌套模块将添加到 OrderedDict _modules
(在 nn.Module.__init__
中初始化)参见 source(L69)
如果 nn.Module.__init__
没有被调用(self._modules
等于 None
),当尝试添加模块时,它会引发错误(没有键可以添加到 None
).看
source(L540-544)
灵感来自 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
这通常发生在 super class 的 init 还没有被调用的时候。在这种情况下,应该使用 super.__init__() 调用 来启动他们的神经网络 class。代码如下所示:
class QuestionClassifier(nn.Module):
def __init__(self, dictionary, embeddings_index, max_seq_length, args):
super().__init__()
这个超级的初始化调用应该在这个class的初始化代码中。
我收到以下错误。
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如下。
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
是我写的class,继承了nn.module
,就像QuestionClassifier
class.
我做错了什么?
查看 pytorch
source code for Module
,我们在文档字符串中看到从 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)
所以您可能想在派生的 class:
中以相同的方式调用Module
的初始化
super(QuestionClassifier, self).__init__()
Pytorch 跟踪您将在自定义模块中编写的子模块(conv1
、conv2
)。在引擎盖下,与您的模型对应的图表是自动构建的。
嵌套模块将添加到 OrderedDict _modules
(在 nn.Module.__init__
中初始化)参见 source(L69)
如果 nn.Module.__init__
没有被调用(self._modules
等于 None
),当尝试添加模块时,它会引发错误(没有键可以添加到 None
).看
source(L540-544)
灵感来自 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
这通常发生在 super class 的 init 还没有被调用的时候。在这种情况下,应该使用 super.__init__() 调用 来启动他们的神经网络 class。代码如下所示:
class QuestionClassifier(nn.Module):
def __init__(self, dictionary, embeddings_index, max_seq_length, args):
super().__init__()
这个超级的初始化调用应该在这个class的初始化代码中。