【问题标题】:Pytorch: merging two models (nn.Module)Pytorch:合并两个模型(nn.Module)
【发布时间】:2020-03-02 23:11:10
【问题描述】:

我有一个非常复杂的模型,因此我不能只调用self.fc.weight 等,所以我想以某种方式迭代模型。

目标是以这种方式合并模型:m = alpha * n + (1 - alpha) * o 其中m no 是同一类的实例,但训练方式不同。因此,对于这些模型中的每个参数,我想根据公式中所述的nom 分配初始值,然后仅使用m 继续训练过程。

我试过了:

for p1, p2, p3 in zip(m.parameters(), n.parameters(), o.parameters()):
    p1 = alpha * p2 + (1 - alpha) * p3

但这不会在mm内分配新值。

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 中是否有更好的方法来做到这一点?是否有可能出现梯度错误?

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    如果我理解正确,那么您需要摆脱 PyTorch 的 autograd 机制,您只需这样做即可

    p1.data = alpha * p2.data+ (1 - alpha) * p3.data
    

    参数的数据不在参数本身,而是在data成员中。

    【讨论】:

    • 所以通过这样做,我强制传递数据而不是引用,因此对 p2 和/或 p3 的更新不会影响 p1,反之亦然?
    • @ted 是的,您正在对“原始”张量执行操作,例如对 numpy 中的数组执行操作。
    猜你喜欢
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多