将DataLoader传入CNN训练阶段触发TypeError错误的排查与解决
解决CNN训练中的TypeError: init() takes 1 positional argument but 2 were given错误
错误重现
训练时触发如下报错:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) ----> 3 training_loop(train_loader,epoch) in training_loop(loader, epoch) 8 optimizer.zero_grad() ----> 9 outputs = classificador(inputs) TypeError: __init__() takes 1 positional argument but 2 were given
问题原因
你在训练循环里直接调用了模型类classificador(inputs),这是典型的用法错误:
classificador是继承自nn.Module的模型类,直接用类名加参数调用,本质是在尝试创建新的模型实例,而非执行前向传播获取输出。- 模型类的
__init__方法仅需self这一个位置参数,你传入inputs作为第二个参数,直接触发了参数不匹配的错误。
从训练执行代码里的Fruitclass.eval()和FruitClass.train()能看出,你已经创建了名为FruitClass(注意代码里大小写不一致,建议统一)的模型实例,但训练循环里未使用该实例,反而错误调用了类本身。
解决方案
1. 确认已正确创建模型实例
先确保代码开头已经初始化了模型实例,并绑定了优化器:
import torch import torch.nn as nn # 创建模型实例 FruitClass = classificador() # 绑定模型参数到优化器 optimizer = torch.optim.Adam(FruitClass.parameters(), lr=0.001)
2. 修改训练循环的前向传播代码
将训练循环里的outputs = classificador(inputs)改为调用已创建的模型实例:
def training_loop(loader,epoch): running_loss = 0. running_accuracy = 0. for i, data in enumerate(loader): inputs,labels = data optimizer.zero_grad() outputs = FruitClass(inputs) # 用模型实例而非类名调用 # 后续损失计算、反向传播等逻辑...
注意:要保证实例名称和训练代码里的FruitClass.eval()一致,同时修正代码里Fruitclass和FruitClass的大小写不一致问题。
额外隐藏错误提示
你的模型forward方法里还有一处容易忽略的错误:
# 错误写法 x = self.dropout(self.activation(self.linear1)) x = self.dropout(self.activation(self.linear2))
这里未将x传入线性层,正确写法应为:
# 正确写法 x = self.dropout(self.activation(self.linear1(x))) x = self.dropout(self.activation(self.linear2(x)))
不修正该问题,后续训练会触发新的报错。
内容的提问来源于stack exchange,提问作者Crab Shin
相关产品推荐
相关产品推荐

