我收到以下错误.
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
Run Code Online (Sandbox Code Playgroud)
我有一个课程如下.
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)
Run Code Online (Sandbox Code Playgroud)
所以,当我运行以下行时:
question_classifier = QuestionClassifier(corpus.dictionary, embeddings_index, corpus.max_sent_length, args)
Run Code Online (Sandbox Code Playgroud)
我得到了上面提到的错误.在这里,EmbeddingLayer并且EncoderRNN是我写的一类继承nn.module类的QuestionClassifier类.
我在这做错了什么?
查看pytorch 源代码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)
Run Code Online (Sandbox Code Playgroud)
所以你可能想Module在派生类中以相同的方式调用init:
super(QuestionClassifier, self).__init__()
Run Code Online (Sandbox Code Playgroud)
Pytorch 会跟踪您将在自定义模块中编写的子模块( conv1、 )。conv2在后台,会自动构建与您的模型相对应的图表。
嵌套的模块将被添加到 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
Run Code Online (Sandbox Code Playgroud)
小智 6
当超类的 init 尚未被调用时,通常会发生这种情况。在这种情况下,应该使用 super.__init__() 调用来启动神经网络类。代码如下所示:
class QuestionClassifier(nn.Module):
def __init__(self, dictionary, embeddings_index, max_seq_length, args):
super().__init__()
Run Code Online (Sandbox Code Playgroud)
这个超级的 init 调用应该在这个类的 init 代码中。
| 归档时间: |
|
| 查看次数: |
3654 次 |
| 最近记录: |