我们可以将代码中所有定义的张量的 .requires_grad 立即重置为零吗

Can we reset .requires_grad of all defined tensors in a code to zero at once

我正在使用 PyTorch 1.6.0 通过 autograd 学习张量(比如说 x)。 学习 x 后,如何重置作为 autograd comp 中节点的每个张量的 .requires_grad。图为零? 我知道 torch.detach() 以及手动将 .requires_grad 设置为 False 。我正在寻找一次性说明。

Ps:我想这样做是因为在我学习 x 的代码部分执行后,我仍然想使用这些张量。另外,有些要转换成numpy。

图中没有为所有张量切换 .requires_grad 的“一次性指令”。

通常 parameters 保存在 torch.nn.Module 个实例中,但如果它们在其他地方,您可以随时将它们添加到某些 list 并对其进行迭代,我会做类似的事情这个:

import torch


class Leafs:
    def __init__(self):
        self.leafs = []

    def add(self, tensor):
        self.leafs.append(tensor)
        return tensor

    def clear(self):
        for leaf in self.leafs:
            leaf.requires_grad_(False)


keeper = Leafs()

x = keeper.add(torch.tensor([1.2], requires_grad=True))
y = keeper.add(torch.tensor([1.3], requires_grad=True))

print(x.requires_grad, y.requires_grad)

keeper.clear()

print(x.requires_grad, y.requires_grad)

通常不需要这样做,如果您不想在计算的某些部分使用梯度,您可以随时使用 with torch.no_grad() 上下文管理器。