You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:40:32