【问题标题】:Gradient with respect to the parameters of a specific layer in PytorchPytorch中特定层参数的梯度
【发布时间】:2021-08-24 23:15:41
【问题描述】:

我正在 pytorch 中构建一个具有多个网络的模型。例如,让我们考虑netAnetB。在损失函数中,我需要使用组合 netA(netB)。在优化的不同部分,我需要计算loss_func(netA(netB)) 的梯度,仅相对于netA 的参数,在另一种情况下,我需要计算netB 的参数的梯度。应该如何解决这个问题?

我的方法:在使用netA的参数计算梯度的情况下,我使用loss_func(netA(netB.detach()))

如果我写loss_func(netA(netB).detach()),似乎netAnetB 的两个参数都是分离的。

我尝试使用loss_func(netA.detach(netB)) 来仅分离netA 的参数,但它不起作用。 (我收到netA 没有属性分离的错误。)

【问题讨论】:

    标签: neural-network pytorch gradient-descent detach


    【解决方案1】:

    梯度是张量而不是网络的属性。
    因此,你只能.detach一个张量。

    您可以为每个网络使用不同的优化器。这样您就可以一直计算所有网络的梯度,但只更新相关网络的权重(调用相关优化器的step)。

    【讨论】:

    • 谢谢,是的,这就是我最终所做的,但它似乎真的效率低下。这似乎不是更好的方法。
    • @user127776 我想你可以在计算较深网络的梯度时丢弃第一个网络的梯度(例如,使用with torch.no_grad():)但是如果你想要第一层的梯度,那么链式法则完全要求你计算第二个的梯度。
    猜你喜欢
    • 2017-09-13
    • 2018-10-14
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 2021-11-25
    • 2018-10-23
    • 2017-12-03
    • 2020-02-10
    相关资源
    最近更新 更多