Python Pytorch:合并两个模型(nn.Module)
我有一个非常复杂的模型,因此我不能只调用Python Pytorch:合并两个模型(nn.Module),python,pytorch,Python,Pytorch,我有一个非常复杂的模型,因此我不能只调用self.fc.weight等,所以我想以某种方式迭代模型 目标是以这种方式合并模型:m=alpha*n+(1-alpha)*o其中mn和o是同一类的实例,但训练方式不同。因此,对于这些模型中的每个参数,我想根据方程中描述的n和o为m分配初始值,然后仅使用m继续训练过程 我试过: for p1, p2, p3 in zip(m.parameters(), n.parameters(), o.parameters()): p1 = alpha * p
self.fc.weight
等,所以我想以某种方式迭代模型
目标是以这种方式合并模型:m=alpha*n+(1-alpha)*o
其中m
n
和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:在就地操作中使用了需要grad的叶变量
于是我求助于一种工作方式
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的自动加载机制中解脱出来,你只需简单地这样做就可以了
p1.data = alpha * p2.data+ (1 - alpha) * p3.data
参数的数据不在参数本身中,而是在
数据
成员中。如果我理解正确,那么您需要脱离PyTorch的自动加载机制,您只需执行以下操作即可
p1.data = alpha * p2.data+ (1 - alpha) * p3.data
参数的数据不在参数本身中,而是在
数据
成员中。因此,通过这样做,我强制数据不是通过引用传递的,因此对p2和/或p3的更新不会影响p1,反之亦然?@ted是的,您正在对“原始”张量执行操作,就像你在numpy中的一个数组上做的那样。因此,通过这样做,我强制执行数据不是传递到引用,这样p2和/或p3的更新不会影响p1,反之亦然?@ted是的,你在对“原始”张量执行操作,就像你在numpy中的数组上做的一样。