微调模型后相同文本预测结果不一致,重启进程恢复正常求助
模型微调后预测结果不一致,重启进程后恢复的解决方案
问题:使用model.train()完成模型微调后,对相同文本进行预测时得到不同结果;但关闭并重启整个进程后,预测结果恢复一致,恳请提供解决方案。
微调代码
input_ids=tokenizer(str(parseddata), padding=True, truncation=True, max_length=500, return_tensors="pt") labels = torch.tensor([0]) lr_scheduler = get_scheduler( name="linear", optimizer=optimizer, num_warmup_steps=0, num_training_steps=2 ) model.train(mode=True) for i in range(2): outputs = model(input_ids, labels=labels) loss = outputs[0] loss.backward() optimizer.step() lr_scheduler.step() optimizer.zero_grad()
预测代码
def predict_label(text): # input_ids = torch.tensor(tokenizer.encode(text)).unsqueeze(0) input_ids=tokenizer(text, padding=True, truncation=True, max_length=500, return_tensors="pt") logits = model(**input_ids)[0] probs = torch.nn.functional.softmax(logits, dim=1) return probs
解决方案
- 问题根源:微调时调用
model.train()将模型设为训练模式,Dropout、BatchNorm等层会引入随机操作(比如随机丢弃神经元、更新批量统计),导致每次预测输出不同。重启进程后模型默认处于评估模式,这些随机操作被禁用,结果就稳定了。 - 修正步骤:
- 预测前必须将模型切换到评估模式,调用
model.eval(); - 预测时使用
torch.no_grad()上下文管理器,关闭梯度计算,避免内存浪费和意外梯度更新。
- 预测前必须将模型切换到评估模式,调用
修正后的预测代码:
def predict_label(text): input_ids = tokenizer(text, padding=True, truncation=True, max_length=500, return_tensors="pt") # 切换到评估模式,禁用随机操作 model.eval() # 关闭梯度计算 with torch.no_grad(): logits = model(**input_ids)[0] probs = torch.nn.functional.softmax(logits, dim=1) return probs
另外,也可以在微调循环结束后直接加上model.eval(),让后续所有预测默认使用评估模式,但预测时仍建议保留torch.no_grad()以减少资源消耗。
内容的提问来源于stack exchange,提问作者tidekis doritos
相关产品推荐
相关产品推荐

