修改预训练模型pre-trained model参数时两次打印参数和结果一致如何解决
问题原因
- 代码中
x = x/100属于变量重赋值操作,没有修改原模型参数的存储内容:执行x = i.data时,x仅持有i.data的内存引用,后续的除法运算生成了新的张量对象,你将新对象赋值给x只是改变了x的指向,不会修改原参数i的实际值。 - 直接操作参数的
.data属性是PyTorch的不推荐用法,易引发计算图相关的隐藏问题。
修复方案
你可以选择以下任意一种方法修改,都能实现参数值的改动:
- 最小改动适配你的现有逻辑,用切片赋值实现原地修改:
ids = [int(p.sum().item()) for p in model.parameters()] print(ids[0]) for i in model.parameters(): x = i.data x[:] = x/100 # 切片赋值会修改原张量的内存内容,而非重定义x变量 break ids = [int(p.sum().item()) for p in model.parameters()] print(ids[0])
- 更规范的PyTorch写法,使用
torch.no_grad()避免计算图被意外修改:
import torch ids = [int(p.sum().item()) for p in model.parameters()] print(ids[0]) with torch.no_grad(): for i in model.parameters(): i.div_(100) # 带下划线的方法是PyTorch的原地操作,直接修改参数值 break ids = [int(p.sum().item()) for p in model.parameters()] print(ids[0])
内容的提问来源于stack exchange,提问作者user15277629
相关产品推荐
相关产品推荐

