我希望训练两个级联网络,例如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
并在 .detach()
中添加 net2(predZ)
即可解决此错误。
这个分离操作可以将net1从net2/optimizor2的计算图中切开。