TypeError: forward() 接受 2 个位置参数,但给出了 3 个

Posted

技术标签:

【中文标题】TypeError: forward() 接受 2 个位置参数,但给出了 3 个【英文标题】:TypeError: forward() takes 2 positional arguments but 3 were given 【发布时间】:2018-03-07 09:39:09 【问题描述】:

你好,我不明白为什么我会得到标题所示的错误,下面是我的前向传播函数

    # For function that will activate neurons and perform forward propagation
def forward(self, inputs):
    state, (hx, cx) = inputs # getting separately the input images to the tuple (hidden states, cell states)
    x = F.relu(self.lstm(state)) # forward propagating the signal from the input images to the 1st convolutional layer
    hx, cx = self.lstm(x, (hx, cx)) # the LSTM takes as input x and the old hidden & cell states and ouputs the new hidden & cell states
    x = hx # getting the useful output, which are the hidden states (principle of the LSTM)
    return self.fcL(x), (hx, cx) # returning the output of the actor (Q(S,A)), and the new hidden & cell states ((hx, cx))

这是我的 action_selection 函数:

    def select_action(self, state):
    #LSTM
    initialise = True # Initialise to zero at first iteration
    if initialise:
        cx = Variable(torch.zeros(1, 30))
        hx = Variable(torch.zeros(1, 30))
    else:  # The hx,cx from the previous iteration
        cx = Variable(cx.data) 
        hx = Variable(hx.data) 
    initialise = False
    q_values, (hx,cx) = self.model(Variable(state), (hx,cx))
    probs = F.softmax((q_values)*self.tau,dim=1)
    #create a random draw from the probability distribution created from softmax
    action = probs.multinomial()
    return action.data[0,0]

【问题讨论】:

这段代码都没有调用过forward函数。 修正缩进。 【参考方案1】:

我只是遇到了同样的非描述性问题,并且没有在课堂外调用 forward 函数作为前面所述的答案。过了一会儿,我发现这是我在 forward 函数中添加到多个“x”变量声明中的第二个值,因为我想创建一个 cuda 张量。我知道这是一个老问题,但它可能会对偶然发现它的人有所帮助。 在 forward 函数下检查您的 x 变量,因为它们不应接受多个参数。

【讨论】:

Forward 函数在 pytorch 中自动调用,当您将 tensor 传递给 Model 时,除了您的明确需要外,这是因为 pytorch 面向对象的方法。【参考方案2】:

您在哪里使用前向功能?意思是它在哪一行抛出错误?没找到。

但一般来说:如果你不是在你的类中使用函数 forward ,而是作为一个对象,它实际上需要一个参数。 (self 是“自动”给出的,因此您可以在类中引用其他内容。为了更好的解释,请阅读以下内容:https://docs.python.org/3/tutorial/classes.html)。因此,例如,如果您尝试执行以下操作:

myObject = myClass()
myObject.forward(a,b)

它会抛出这个错误

【讨论】:

以上是关于TypeError: forward() 接受 2 个位置参数,但给出了 3 个的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch BERT TypeError: forward() got an unexpected keyword argument 'labels'

TypeError: _transform() 接受 2 个位置参数,但给出了 3 个

TypeError: __init__() 接受 1 个位置参数,但给出了 2 个

TypeError: login() 接受 1 个位置参数,但给出了 2 个

TypeError: view() 最多接受 2 个参数(给定 3 个)

TypeError: done() 接受 1 个位置参数,但给出了 2 个