Neural network 关于Pyrotch中特定层参数的梯度

Neural 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)

我正在用pytorch构建一个具有多个网络的模型。例如,让我们考虑<代码> NETA和<代码> NETB。在loss函数中,我需要使用composition
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():),但是如果您想要第一层的梯度,然后链式法则要求你也计算第二个的梯度。