python - PyTorch - 类型错误 : forward() takes 1 positional argument but 2 were given

标签 python pytorch

我不明白这个错误从何而来,模型的参数数量似乎是正确的,下面是我的模型:

class MancalaModel(nn.Module):

    def __init__(self, n_inputs=16, n_outputs=16):
        super().__init__()

        n_neurons = 256

        def create_block(n_in, n_out):
            block = nn.ModuleList()
            block.append(nn.Linear(n_in, n_out))
            block.append(nn.ReLU())
            return block

        self.blocks = nn.ModuleList()
        self.blocks.append(create_block(n_inputs, n_neurons))
        for _ in range(6):
            self.blocks.append(create_block(n_neurons, n_neurons))

        self.actor_block = nn.ModuleList()
        self.critic_block = nn.ModuleList()
        for _ in range(2):
            self.actor_block.append(create_block(n_neurons, n_neurons))
            self.critic_block.append(create_block(n_neurons, n_neurons))

        self.actor_block.append(create_block(n_neurons, n_outputs))
        self.critic_block.append(create_block(n_neurons, 1))

        self.apply(init_weights)

    def forward(self, x):
        x = self.blocks(x)
        actor = F.softmax(self.actor_block(x))
        critics = self.critic_block(x)
        return actor, critics

然后我创建一个实例并使用随机数进行前向传递

model = MancalaModel()
x = model(torch.rand(1, 16))

然后我收到 TypeError 说参数数量不正确:

      2 model = MancalaModel()
----> 3 x = model(torch.rand(1, 16))
      4 # summary(model, (16,), device='cpu')
      5 

d:\environments\python\lib\site-packages\torch\nn\modules\module.py in _call_impl(self, *input, **kwargs)
    725             result = self._slow_forward(*input, **kwargs)
    726         else:
--> 727             result = self.forward(*input, **kwargs)
    728         for hook in itertools.chain(
    729                 _global_forward_hooks.values(),

D:\UOM\Year3\AI & Games\KalahPlayer\agents\model_agent.py in forward(self, x)
     54 
     55     def forward(self, x):
---> 56         x = self.blocks(x)
     57         actor = F.softmax(self.actor_block(x))
     58         critics = self.critic_block(x)

d:\environments\python\lib\site-packages\torch\nn\modules\module.py in _call_impl(self, *input, **kwargs)
    725             result = self._slow_forward(*input, **kwargs)
    726         else:
--> 727             result = self.forward(*input, **kwargs)
    728         for hook in itertools.chain(
    729                 _global_forward_hooks.values(),

TypeError: forward() takes 1 positional argument but 2 were given

感谢任何帮助,谢谢!

最佳答案

TL;DR
您正在尝试通过nn.ModuleList转发 - 这没有定义。 您需要将 self.blocks 转换为 nn.Sequential :

        def create_block(n_in, n_out):
            # do not work with ModuleList here either.
            block = nn.Sequential(
              nn.Linear(n_in, n_out),
              nn.ReLU()
            )
            return block

        blocks = []  # simple list - not a member of self, for temporal use only.
        blocks.append(create_block(n_inputs, n_neurons))
        for _ in range(6):
            blocks.append(create_block(n_neurons, n_neurons))
        self.blocks = nn.Sequential(*blocks)  # convert the simple list to nn.Sequential

我原以为您会得到 NotImplementedError,而不是这个 TypeError,因为您的 self.blocks 的类型为 nn。 ModuleList 及其 forward 方法抛出 NotImplementedError。我刚刚做了一个pull request解决这个令人困惑的问题。
更新(2021 年 4 月 22 日): PR was merged 。在未来的版本中,当调用 nn.ModuleList 或 nn.ModuleDict 时,您应该会看到 NotImplementedError

关于python - PyTorch - 类型错误 : forward() takes 1 positional argument but 2 were given,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65096679/

相关文章:

python-3.x - 层列表的 PyTorch 模型抛出错误

python - 连接来自两种不同输入模态的两个不同形状的张量

python - 将 RGB 数组乘以颜色变换矩阵进行矢量化,用于图像处理

Python 项目结构 : "Unresolved reference"

python - 从 QT Creator 转换对话框并将其合并到我的主窗口中的更好方法

tensorflow - 通过finetuning训练全卷积网络时如何处理BatchNorm层?

python - Django 测试 : Using a login decorator for test cases

python - 多行为空时如何进行合并

python - 在 PyTorch 中加载 Torch7 训练模型 (.t7)

pytorch - 第二次前向传递时 Cuda 循环内存不足?