Neural network 关于Pyrotch中特定层参数的梯度
我正在用pytorch构建一个具有多个网络的模型。例如,让我们考虑<代码> NETA和<代码> NETB。在loss函数中,我需要使用compositionNeural network 关于Pyrotch中特定层参数的梯度,neural-network,pytorch,gradient-descent,detach,Neural Network,Pytorch,Gradient Descent,Detach,我正在用pytorch构建一个具有多个网络的模型。例如,让我们考虑 NETA和 NETB。在loss函数中,我需要使用compositionnetA(netB)。在优化的不同部分,我需要计算loss_func(netA(netB))的梯度,仅针对netA的参数,在另一种情况下,我需要计算netB的参数的梯度。应该如何处理这个问题 我的方法是:在计算梯度wrt时,使用netA的参数loss\u func(netA(netB.detach()) 如果我写入loss\u func(netA(netB)
netA(netB)
。在优化的不同部分,我需要计算loss_func(netA(netB))
的梯度,仅针对netA
的参数,在另一种情况下,我需要计算netB
的参数的梯度。应该如何处理这个问题
我的方法是:在计算梯度wrt时,使用netA
的参数loss\u func(netA(netB.detach())
如果我写入loss\u func(netA(netB).detach())
则netA
和netB
的两个参数似乎都已分离
我试图使用
loss\u func(netA.detach(netB))
来仅分离netA
的参数,但它不起作用。(我得到的错误是,netA
没有属性分离。)梯度是张量而不是网络的属性。因此,您只能
.detach
一个张量
您可以为每个网络使用不同的优化器。通过这种方式,您可以一直计算所有网络的梯度,但只更新相关网络的权重(调用相关优化器的
步骤
。谢谢,是的,这就是我最后所做的,但它似乎真的效率很低。这似乎不是一个更好的方法。@user127776我想在计算较深网络的梯度时,您可以放弃第一个网络的梯度(例如,使用torch.no_grad():),但是如果您想要第一层的梯度,然后链式法则要求你也计算第二个的梯度。