PyTorch调用自定义猫狗分类模型抛出forward参数不匹配TypeError如何解决
触发当前报错的直接原因
自定义NN类的forward方法缺少类实例必须的self入参:
- 错误写法:
def forward (x): - 正确写法:
def forward(self, x):
PyTorch调用模型时,model(imagepre)的执行逻辑是将模型实例本身和输入imagepre一起传给forward方法,原方法只声明了1个入参,实际传入了2个,因此抛出forward() takes 1 positional argument but 2 were given的错误。
修复报错后会遇到的其他问题
这些是代码里已经存在、只是被当前报错挡住没暴露的问题:
- 批次遍历逻辑错误:
for y_label in enumerate(dataloader):会把枚举结果(批次索引, (批次图像, 批次标签))整个元组赋值给y_label,既没有正确获取每一批的输入和标签,循环内还一直使用外部提前取出的单样本imagepre做推理,完全没有遍历数据集。正确遍历写法:for batch_idx, (batch_x, batch_y) in dataloader: pred = model(batch_x) - 变量名大小写不匹配:推理结果赋值为大写开头的
Pred,计算损失时却用小写的pred,会触发NameError。 - 模型最后一层额外加
nn.ReLU()冗余且有害:使用的nn.CrossEntropyLoss内部已经集成LogSoftmax计算,最后一层只需保留线性层输出的logits即可,加ReLU会把负输出值全部截断为0,严重降低分类精度。 - 模型初始化的输入尺寸参数大概率错误:初始化模型时传入
input_size=256,如果输入是图像,经过nn.Flatten()后的维度为通道数*图像高*图像宽,RGB三通道的猫狗图像这个值远大于256,需要根据实际图像尺寸调整参数,否则会触发维度不匹配报错。
关于代码简洁性的说明
目前堆叠了8层全连接线性层,对猫狗分类这类简单任务来说参数冗余度极高,过拟合风险大、训练效率低。如果是练习全连接结构,2-3层线性层就足够;如果追求效率,换成轻量CNN结构的参数量会比全连接小一个数量级,精度还更高。
修正后的核心模型代码参考:
class NN(nn.Module): def __init__(self, input_size, output_size): super().__init__() self.flatten = nn.Flatten() self.stack = nn.Sequential( nn.Linear(input_size, 300), nn.ReLU(), nn.Linear(300, 256), nn.ReLU(), nn.Linear(256, output_size) ) def forward(self, x): x = self.flatten(x) return self.stack(x)
内容的提问来源于stack exchange,提问作者The Oracle
相关产品推荐
相关产品推荐

