使用 PyTorch 迭代训练两个模型

问题描述 投票:0回答:1

我希望训练两个级联网络,例如X->Z->Y,Z=net1(X),Y=net2(Z)。 我希望迭代地优化这两个网络的参数,即对于net1的固定参数,首先使用MSE(predY,Y)loss util收敛来训练net2的参数;然后,使用收敛的 MSE 损失来训练 net1 的迭代,等等。 因此,我分别为每个网络定义了两个优化器。我的训练代码如下:

net1 = SimpleLinearF()
opt1 = torch.optim.Adam(net1.parameters(), lr=0.01)
loss_func = nn.MSELoss()

for itera1 in range(num_iters1 + 1):
    predZ = net1(X)
        
    net2 = SimpleLinearF()
    opt2 = torch.optim.Adam(net2.parameters(), lr=0.01)
    for itera2 in range(num_iters2 + 1):
        predY = net2(predZ)
        loss = loss_func(predY,Y)
        if itera2 % (num_iters2 // 2) == 0:
            print('iteration: {:d}, loss: {:.7f}'.format(int(itera2), float(loss)))
        loss.backward(retain_graph=True)
        opt2.step()
        opt2.zero_grad()
    
    loss.backward()
    opt1.step()
    opt1.zero_grad()

但是,我遇到了以下错误:

RuntimeError: one of the variables needed for gradient computation has been modified by an 
inplace operation: [torch.FloatTensor [1, 1]], which is output 0 of AsStridedBackward0, is at
version 502; expected version 501 instead. Hint: enable anomaly detection to find the 
operation that failed to compute its gradient, with torch.autograd.set_detect_anomaly(True).

为什么会出现这个错误以及如何解决?

machine-learning pytorch
1个回答
0
投票

在 PyTorch 计算图上进行一些搜索后,我找到了问题的答案。

只需删除

retain_graph=True
并在
.detach()
中添加
net2(predZ)
即可解决此错误。

这个分离操作可以将net1从net2/optimizor2的计算图中切开。

© www.soinside.com 2019 - 2024. All rights reserved.