如何手动修改PyTorch模型参数?索引赋值更新不生效怎么解决?
问题原因
PyTorch 中对张量使用两个独立一维张量做花式索引时,返回的是原张量数据的副本,而非指向原内存的视图。你第一种写法里net.fc2.weight[j,i].data拿到的是副本的data,修改副本的值自然不会同步到原模型的fc2.weight参数里。
而你第二种写法用的是单维度连续切片索引,这种索引返回的是原张量的视图,修改视图的data会直接修改原参数的内存数据,所以更新可以生效。
解决办法
要实现指定位置的参数手动更新,常用有两种写法:
方法1:直接对原张量索引位置做原位更新
不要先取索引结果再修改,直接对原张量的指定索引位置做操作,同时建议用torch.no_grad()包裹避免梯度计算异常:
with torch.no_grad(): net.fc2.weight[j, i] += update.squeeze()
方法2:使用index_put_原位方法
如果要更明确控制更新逻辑,可以用PyTorch内置的index_put_原位操作:
with torch.no_grad(): # accumulate=True表示在原有值基础上累加,设为False则直接覆盖赋值 net.fc2.weight.index_put_(indices=(j, i), values=update.squeeze(), accumulate=True)
两种写法运行后,你再打印net.fc2.weight的对应位置,就能看到参数已经成功更新。
内容的提问来源于stack exchange,提问作者Penguin
相关产品推荐
相关产品推荐

