在遗留 PyTorch 中使用 requires_grad=False 将张量包装在 Variable 中的实用程序

Utility of wrapping tensor in Variable with requires_grad=False in legacy PyTorch

我使用的是 2017/18 年编写的代码库,我发现了以下代码:

audio_norm = audio_norm.unsqueeze(0)
audio_norm = torch.autograd.Variable(audio_norm, requires_grad=False)

我知道在 Variable 中包装张量以前允许将它们的梯度合并到 Torch 为以前版本的 Torch 构建的计算图中(现在不再需要),但我很困惑它的效用是什么在 torch.autograd.Variable(my_tensor, requires_grad=False) 中包装张量将是。

有人可以解释一下这是否是一个成语以及类似的现代 Torch 代码是什么?我的猜测是在张量上调用 detach 以停止跟踪其梯度。

作为参考,代码库中的相关行是 line 45 from the data_utils.py script of NVIDIA's Tacotron 2 implementation。谢谢。

在 PyTorch 0.3.1 及更早版本中,任何涉及需要由 autograd 跟踪的计算的张量都必须包装在 Variable 中。语义上 Variable.requires_grad 在 PyTorch 0.3.1 及更早版本中等同于 Tensor.requires_grad 现在。基本上,requires_grad=False 只是告诉 autograd 你永远不需要梯度 w.r.t。 variable/tensor。只有在至少一个输入 variable/tensor 具有 requires_grad=True.

时,才会记录数学运算(即构建计算图)

请注意,任何使用比 0.3.1 更新的 PyTorch 的代码实际上并不需要使用 Variable,这包括您提供的存储库中的代码(明确要求 PyTorch >= 1.0)。在 0.4 中,Variable 的功能被合并到 Tensor class 中。在现代 PyTorch 中,您只需设置张量的 requires_grad 属性即可实现相同的行为。默认情况下,已经使用 requires_grad=False 构建了一个新的 user-defined 张量,因此您发布的代码的现代等价物通常只是删除 Variable 行。如果你不确定张量是否已经有 requires_grad == False 那么你可以明确地设置它。

audio_norm = audio_norm.unsqueeze(0)
audio_norm.requires_grad_(False)

您可以阅读遗留文档 here 了解更多信息。

您正在寻找

audio_norm = audio_norm.unsqueeze(0)
audio_norm = torch.tensor(audio_norm)

如果你需要它来要求毕业那么

audio_norm = torch.tensor(audio_norm, require_grad=True)