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中的数组上做的一样。