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变量没有关系。
修复步骤
- 修正线程调用逻辑:先保存初始化完成的模型实例,给
Thread传函数引用和参数元组,不要直接在target位置调用训练函数。 - 调整执行时序:启动训练线程后,调用
join()等待模型训练完成,再把训练好的模型实例传入get_probability()做推理,不要在训练刚启动时就执行推理逻辑。 - 不要把线程启动的返回值赋值给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
相关产品推荐
相关产品推荐

