仅计算Pytorch中前端网络的梯度
我有一个非常简单的问题 假设我有两个网络要训练(即net1、net2)。 net1的输出将在训练时输入net2。 在我的情况下,我只想更新net1:仅计算Pytorch中前端网络的梯度,pytorch,Pytorch,我有一个非常简单的问题 假设我有两个网络要训练(即net1、net2)。 net1的输出将在训练时输入net2。 在我的情况下,我只想更新net1: optimizer=Optimizer(net1.parameters(), **kwargs) loss=net2(net1(x)) loss.backward() optimizer.step() 虽然这将实现我的目标,但它会占用太多的冗余内存,因为这将计算net2的梯度(导致OOM错误)。 因此,我尝试了几种方法来解决这个问题: 火炬编号和
optimizer=Optimizer(net1.parameters(), **kwargs)
loss=net2(net1(x))
loss.backward()
optimizer.step()
虽然这将实现我的目标,但它会占用太多的冗余内存,因为这将计算net2的梯度(导致OOM错误)。
因此,我尝试了几种方法来解决这个问题:
如果您有任何建议,我们将不胜感激。首先,让我们试着了解您的方法不起作用的原因
net1
需要渐变,因此忽略后续的需要\u grad=False
这基本上允许您分别计算和处理
net1
和net2
的梯度。请注意,您确实需要所有渐变信息才能通过net2
,否则无法计算渐变wrt<代码>网络1 你完全正确。我需要所有的梯度信息来训练net1。torch.utils.checkpoint对我来说非常有效!谢谢
z=net1(x)
with torch.no_grad():
loss=net2(z)
net2.requires_grad=False
loss=net2(net1(x))
z=net1(x)
loss=net2(z).detach()
net2.eval()
loss=net2(net1(x))