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

PyTorch报错forward()缺参数x、NoneType不可调用排查

错误根因
  • 核心错误出在learningPart()方法的模型训练启动逻辑:Python标准库Thread对象的start()方法没有返回值,执行后默认返回None,你把这个None赋值给了model变量,再传给get_probability()时,拿到的根本不是训练好的VGG模型实例,所以执行model.eval()、后续调用model(images.cuda())时就会触发类型错误。
  • 线程用法本身也写错了:Thread的target参数需要传入函数引用,你现在写的target=self.train_model(...)是在主线程里立刻同步执行了train_model方法,根本没有实现子线程异步训练的效果;而且执行完start()后立刻调用get_probability(),就算线程写法正确,也会出现训练还没完成就开始推理的时序问题。
  • 你看到的forward() missing 1 required positional argument: 'x'是连锁报错:因为传入的不是合法的PyTorch模型对象,调用时的参数匹配逻辑完全失效,和你没自定义forward、没定义x变量没有关系。
修复步骤
  1. 修正线程调用逻辑:先保存初始化完成的模型实例,给Thread传函数引用和参数元组,不要直接在target位置调用训练函数。
  2. 调整执行时序:启动训练线程后,调用join()等待模型训练完成,再把训练好的模型实例传入get_probability()做推理,不要在训练刚启动时就执行推理逻辑。
  3. 不要把线程启动的返回值赋值给model变量,model变量要始终持有初始化、训练完成的神经网络实例。
修正后的核心代码片段
# learningPart方法中模型训练与调用部分的修正代码
model = models.vgg11_bn(pretrained = True)
optimizer = optim.SGD(model.parameters(), lr=0.0001, momentum = 0.99)
step_lr_scheduler = lr_scheduler.StepLR(optimizer, step_size = 10, gamma=0.1)
num_ftrs = model.classifier[0].in_features
model.classifier = nn.Linear(num_ftrs, num_classes)
model = model.to(device)

# 修正线程写法:target传函数引用,args传调用参数
train_thread = Thread(
    target=self.train_model,
    args=(model, criterion, optimizer, step_lr_scheduler, num_epochs, 'Kaggle_vgg11')
)
train_thread.start()
# 等待训练完成再执行后续推理
train_thread.join()

# 传入训练完成的真实模型实例,而不是线程start的返回值
self.get_probability(image_datasets, model, data_dir, model_name='Kaggle_vgg11')

补充说明:如果不需要异步训练,完全可以去掉多线程逻辑,直接在主线程调用self.train_model(...),执行完后顺序调用get_probability即可,代码逻辑更简单也不容易出时序问题。

内容的提问来源于stack exchange,提问作者user13422043

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 23:18:15