Pytorch 中特定层参数的梯度
Gradient with respect to the parameters of a specific layer in Pytorch
我正在使用多个网络在 pytorch 中构建模型。例如,让我们考虑 netA
和 netB
。在损失函数中,我需要使用组合 netA(netB)
。在优化的不同部分,我需要计算 loss_func(netA(netB))
仅关于 netA
参数的梯度,而在另一种情况下,我需要计算 netB
参数的梯度。应该如何解决这个问题?
我的方法:在使用 netA
的参数计算梯度的情况下,我使用 loss_func(netA(netB.detach()))
.
如果我写 loss_func(netA(netB).detach())
似乎 netA
和 netB
的两个参数都是分离的。
我尝试使用 loss_func(netA.detach(netB))
以便仅分离 netA
的参数,但它不起作用。 (我得到 netA
没有属性分离的错误。)
梯度是张量而非网络的属性。
因此,你只能.detach
一个张量。
您可以为每个网络设置不同的优化器。这样你就可以一直计算所有网络的梯度,但只更新相关网络的权重(调用相关优化器的step
)。
我正在使用多个网络在 pytorch 中构建模型。例如,让我们考虑 netA
和 netB
。在损失函数中,我需要使用组合 netA(netB)
。在优化的不同部分,我需要计算 loss_func(netA(netB))
仅关于 netA
参数的梯度,而在另一种情况下,我需要计算 netB
参数的梯度。应该如何解决这个问题?
我的方法:在使用 netA
的参数计算梯度的情况下,我使用 loss_func(netA(netB.detach()))
.
如果我写 loss_func(netA(netB).detach())
似乎 netA
和 netB
的两个参数都是分离的。
我尝试使用 loss_func(netA.detach(netB))
以便仅分离 netA
的参数,但它不起作用。 (我得到 netA
没有属性分离的错误。)
梯度是张量而非网络的属性。
因此,你只能.detach
一个张量。
您可以为每个网络设置不同的优化器。这样你就可以一直计算所有网络的梯度,但只更新相关网络的权重(调用相关优化器的step
)。