我有一个非常复杂的模型,因此我不能只调用self.fc.weight
等,所以我想以某种方式对模型进行迭代
目标是以这种方式合并模型:m = alpha * n + (1 - alpha) * o
其中m
{o
是同一类的实例,但训练方式不同。因此,对于这些模型中的每个参数,我想根据方程中描述的n
和o
为m
分配初始值,然后仅使用m
继续训练过程
我试过:
for p1, p2, p3 in zip(m.parameters(), n.parameters(), o.parameters()):
p1 = alpha * p2 + (1 - alpha) * p3
但这不会在m
内分配新值
for p1, p2, p3 in zip(m.parameters(), n.parameters(), o.parameters()):
p1.fill_(alpha * p2 + (1 - alpha) * p3)
但这会使
RuntimeError: a leaf Variable that requires grad has been used in an in-place operation.
于是我求助于一种工作方式
m.load_state_dict({
k: alpha * v1 + (1 - alpha) * v2
for (k, v1), (_, v2) in zip(n.state_dict().items(), o.state_dict().items())
})
在Pytorch中有更好的方法吗?我有可能得到梯度误差吗
如果我没弄错的话,那么你需要摆脱PyTorch的自动签名机制,你只需简单地这么做就可以了
参数的数据不在参数本身中,而是在
data
成员中相关问题 更多 >
编程相关推荐