【问题标题】:PyTorch preserving gradient using external librariesPyTorch 使用外部库保留梯度
【发布时间】:2021-06-04 02:49:50
【问题描述】:

我有一个 GAN,它返回预测的 torch.tensor。为了指导这个网络,我有一个损失函数,它是二元交叉熵损失 (BCELoss) 和 Wasserstein 距离的总和。但是,为了计算 Wasserstein 距离,我使用了 scipy.stats.wasserstein_distance 库中的 scipy.stats.wasserstein_distance 函数。您可能知道,此函数需要两个 NumPy 数组作为输入。所以,为了使用这个函数,我将我的预测张量和真实张量转换为NumPy 数组,如下所示

pred_np = pred_tensor.detach().cpu().clone().numpy().ravel()
target_np = target_tensor.detach().cpu().clone().numpy().ravel()

W_loss = wasserstein_distance(pred_np, target_np)

然后,通过将W_loss 与BCELoss 相加得到总损失。我现在展示这部分是因为它有点不必要并且与我的问题无关。

我担心的是我正在分离梯度,所以我想在优化和更新模型参数时它不会考虑W_loss。我是一个新手,所以我希望我的问题很清楚,并感谢您提前回答。

【问题讨论】:

    标签: scipy pytorch generative-adversarial-network


    【解决方案1】:

    添加一个不是需要_grad的张量到你的损失的对象本质上是添加一个常数。常数的导数为零,因此这个附加项对您的网络权重没有任何影响。

    tl;博士: 您需要在 pytorch 中重写损失计算(或者只是找到现有的实现,互联网上有很多)。

    【讨论】:

    • 如果我添加W_loss = torch.tensor(W_loss, requires_grad=True)会怎样?
    • 没什么用的。 Pytorch 无法通过非张量对象跟踪梯度。你会有一个需要 grad (很好)的张量,它由一个 numpy 数组组成,它甚至不能跟踪 grad (woops)。没有可以穿透该 numpy 数组的反向计算,因此没有梯度会从那里到达模型的参数。
    猜你喜欢
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 2018-10-23
    相关资源
    最近更新 更多