Разница между "detach ()" и "с torch.nograd ()" в PyTorch? - PullRequest
0 голосов
/ 29 июня 2019

Я знаю о двух способах исключения элементов вычисления из расчета градиента backward

Метод 1: с использованием with torch.no_grad()

with torch.no_grad():
    y = reward + gamma * torch.max(net.forward(x))
loss = criterion(net.forward(torch.from_numpy(o)), y)
loss.backward();

Метод 2: с использованием .detach()

y = reward + gamma * torch.max(net.forward(x))
loss = criterion(net.forward(torch.from_numpy(o)), y.detach())
loss.backward();

Есть ли разница между этими двумя? Есть ли плюсы / минусы у обоих?

1 Ответ

2 голосов
/ 29 июня 2019

tensor.detach() создает тензор, который разделяет хранилище с тензором, который не требует градации.Он отделяет вывод от вычислительного графа.Таким образом, градиент не будет распространяться вдоль этой переменной.

Оболочка with torch.no_grad() временно установит для всех флагов requires_grad значение false.torch.no_grad говорит, что никакая операция не должна строить график.

Разница в том, что одна ссылается только на данную переменную, для которой она вызывается.Другое влияет на все операции, выполняемые в операторе with.Кроме того, torch.no_grad будет использовать меньше памяти, поскольку с самого начала он знает, что градиенты не нужны, поэтому не нужно сохранять промежуточные результаты.

Узнайте больше о различиях между ними, а также примеры из здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...