使用PyTorch迭代训练两个模型



我希望训练两个级联网络,例如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).

有人知道为什么会出现这种错误吗?我该如何解决这个问题。非常感谢。

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

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

此分离操作可以将net1从net2/优化器2的计算图中删除。

最新更新