PyTorch 使用外部库保存梯度
PyTorch preserving gradient using external libraries
我有一个 returns 预测 torch.tensor
的 GAN。为了引导这个网络,我有一个损失函数,它是二元交叉熵损失 (BCELoss
) 和 Wasserstein 距离的总和。但是,为了计算 Wasserstein 距离,我使用了 SciPy
库中的 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)
然后,BCELoss
加上W_loss
得到total loss。我现在展示这部分是因为它有点不必要并且与我的问题无关。
我担心的是我正在分离梯度,所以我想在优化和更新模型参数时它不会考虑 W_loss
。我有点新手,所以我希望我的问题很清楚,并感谢您提前回答。
添加一个 不是 张量的对象 requires_grad 到你的损失本质上是添加一个常数。常数的导数为零,因此这个附加项不会对您的网络权重产生任何影响。
tl;博士:
你需要在pytorch中重写loss计算(或者找一个现有的实现,网上有很多)。
我有一个 returns 预测 torch.tensor
的 GAN。为了引导这个网络,我有一个损失函数,它是二元交叉熵损失 (BCELoss
) 和 Wasserstein 距离的总和。但是,为了计算 Wasserstein 距离,我使用了 SciPy
库中的 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)
然后,BCELoss
加上W_loss
得到total loss。我现在展示这部分是因为它有点不必要并且与我的问题无关。
我担心的是我正在分离梯度,所以我想在优化和更新模型参数时它不会考虑 W_loss
。我有点新手,所以我希望我的问题很清楚,并感谢您提前回答。
添加一个 不是 张量的对象 requires_grad 到你的损失本质上是添加一个常数。常数的导数为零,因此这个附加项不会对您的网络权重产生任何影响。
tl;博士: 你需要在pytorch中重写loss计算(或者找一个现有的实现,网上有很多)。