Можем ли мы сбросить .require_grad всех определенных тензоров в коде до нуля сразу

#python #pytorch #autograd

#python #pytorch #автоград

Вопрос:

Я использую PyTorch 1.6.0 для изучения тензора (скажем, x) с помощью autograd. После того, как x изучен, как я могу сбросить .require_grad каждого тензора, который был узлом в autograd comp. graph до нуля? Я знаю о torch.detach() и о настройке .require_grad на False вручную. Я ищу одноразовую инструкцию.

Ps: Я хочу это сделать, потому что я все еще хочу использовать эти тензоры после выполнения части моего кода, которая изучает x. Кроме того, некоторые из них должны быть преобразованы в numpy.

Ответ №1:

Не существует «одноразовой инструкции» для переключения .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() context manager.