【问题标题】:TypeError: forward() takes 2 positional arguments but 3 were given in pytorchTypeError: forward() 接受 2 个位置参数,但 3 个在 pytorch 中给出
【发布时间】:2021-07-06 10:40:30
【问题描述】:

我的训练循环中有以下错误,我不太明白问题出在哪里。我目前正在编写这段代码,所以东西不是最终的,但我无法弄清楚这个问题是什么。

我已经尝试在谷歌上搜索错误并阅读了一些答案,但似乎仍然无法理解问题的症结。

数据集和数据加载器 (X 和 Y 已经给我了,它们都是 [2000, 40, 1] 张量)

class TrainingDataset(data.Dataset):
  def __init__(self, X, y):
    self.X = X
    self.y = y

  def __len__(self):
    return Nf
    
  # returns corresponding input/output pairs
  def __getitem__(self, t):
    X = self.X[t]
    y = self.y[t]

    #print(X.shape, y.shape)

    return X, y

# prints torch.Size([2000, 40, 1]) torch.Size([2000, 40, 1])
print(x.size(), y.size())

dataset = TrainingDataset(x,y)
batchSize = 20
dataIter = data.DataLoader(dataset, batchSize)

型号:

class Encoder(nn.Module):
  def __init__(self, num_inputs = 40, num_outputs = 40):
    super(Encoder, self).__init__()
    
    self.num_inputs = num_inputs
    self.num_hidden = num_hidden
    self.num_outputs = num_outputs

    self.layers = nn.Sequential(
        nn.Linear(num_inputs, num_outputs), 
        nn.ReLU(),
        nn.Linear(num_outputs, num_outputs),
        nn.ReLU(),
        nn.Linear(num_outputs, num_outputs) 
    )

  def forward(self, x_c, y_c):
    return self.layers(x_c, y_c)

训练循环:

for epoch in range(epochs): 
  for batch in dataIter:
    optimiser.zero_grad()
    l = loss(encoder(x_c=batch[0], y_c=batch[1]), batch[1])
    l.backward()
    optimiser.step()

错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-15-aa1c60616d82> in <module>()
      6   for batch in dataIter:
      7     optimiser.zero_grad()
----> 8     l = loss(encoder(x_c=batch[0], y_c=batch[1]), batch[1])
      9     l.backward()
     10     optimiser.step()

2 frames
/usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
    887             result = self._slow_forward(*input, **kwargs)
    888         else:
--> 889             result = self.forward(*input, **kwargs)
    890         for hook in itertools.chain(
    891                 _global_forward_hooks.values(),

TypeError: forward() takes 2 positional arguments but 3 were given

谁能指出我正确的方向?我刚刚开始学习和做 pytorch,所以我还不擅长这些。

【问题讨论】:

  • @drum 这是整个错误信息

标签: python pytorch


【解决方案1】:
  def forward(self, x_c, y_c):
    return self.layers(x_c, y_c)

你的错误在这里,这个函数除了self之外应该只有1个参数。

【讨论】:

  • 转发函数不能有超过1个参数吗?
  • tldr:是的,是的,但实际上没有。使用 encoder(...) 调用带有 1 个参数的转发,但您的转发仍然存在,没有人使用它
  • 嗨,所以要明确一点,不应该使用多个参数来调用转发?我正在运行一个类似的 seq2seq 模型,我的解码器在前向参数中将输入、编码器状态以及隐藏和单元状态作为输入。然而,这会引发与 OP 相同的错误
猜你喜欢
  • 2020-06-16
  • 2021-09-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
  • 2020-03-27
相关资源
最近更新 更多