#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.