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

微调模型后相同文本预测结果不一致,重启进程恢复正常求助

模型微调后预测结果不一致,重启进程后恢复的解决方案

问题:使用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等层会引入随机操作(比如随机丢弃神经元、更新批量统计),导致每次预测输出不同。重启进程后模型默认处于评估模式,这些随机操作被禁用,结果就稳定了。
  • 修正步骤:
    1. 预测前必须将模型切换到评估模式,调用model.eval();
    2. 预测时使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 00:45:11