Функция PyTorch torch.enable_grad
Справочное руководство Pytorch torch
torch.enable_gradЭто контекстный менеджер в PyTorch, используемый для включения вычисления градиентов. Онtorch.no_gradявляется противоположным и используется для явного включения вычисления градиентов в блоках кода, которые требуют градиентов.
Это очень полезно, когда вам временно нужно обучить модель в коде инференса, или когда вам нужно включить вычисление градиентов в локальной области.
Определение функции
torch.enable_grad()
Parameters:
- Нет параметров. Это контекстный менеджер.
Возвращаемое значение:
- Возвращает контекстный менеджер, который включает вычисление градиентов в этом контексте.
Примеры использования
Пример 1: Базовое использование
Пример
import torch
# По умолчанию, в контексте no_grad
with torch.no_grad():
x = torch.tensor([1.0, 2.0, 3.0])
print("In no_grad:", x.requires_grad)
# Используйте enable_grad, чтобы временно включить градиенты
with torch.enable_grad():
y = x * 2
print("В enable_grad:", y.requires_grad)
# После выхода восстановить состояние no_grad
z = x * 2
print("После выхода:", z.requires_grad)
# По умолчанию, в контексте no_grad
with torch.no_grad():
x = torch.tensor([1.0, 2.0, 3.0])
print("In no_grad:", x.requires_grad)
# Используйте enable_grad, чтобы временно включить градиенты
with torch.enable_grad():
y = x * 2
print("В enable_grad:", y.requires_grad)
# После выхода восстановить состояние no_grad
z = x * 2
print("После выхода:", z.requires_grad)
Вывод:
在 no_grad 中: False 在 enable_grad 中: True 退出后: False
Пример 2: Смешивание обучения и инференса
Пример
import torch
import torch.nn as nn
model = nn.Linear(10, 2)
# Режим инференса
with torch.no_grad():
x = torch.randn(5, 10)
output1 = model(x)
print("Результат инференса:", output1.shape)
# Если нужно временно обучить некоторые параметры во время инференса
with torch.enable_grad():
# Создать тензор, требующий градиентов для вычислений
temp_weight = torch.randn(10, 10, requires_grad=True)
temp_output = torch.mm(x, temp_weight)
print("Временное включение градиентов:", temp_output.requires_grad)
import torch.nn as nn
model = nn.Linear(10, 2)
# Режим инференса
with torch.no_grad():
x = torch.randn(5, 10)
output1 = model(x)
print("Результат инференса:", output1.shape)
# Если нужно временно обучить некоторые параметры во время инференса
with torch.enable_grad():
# Создать тензор, требующий градиентов для вычислений
temp_weight = torch.randn(10, 10, requires_grad=True)
temp_output = torch.mm(x, temp_weight)
print("Временное включение градиентов:", temp_output.requires_grad)
Вывод:
推理输出: torch.Size([5, 2]) 临时启用梯度: True
Пример 3: Использование в качестве декоратора
Пример
import torch
@torch.enable_grad()
def train_step(x, y):
"""Имитировать шаги обучения"""
# Эта функция включит вычисление градиента внутри
loss = (x - y).sum()
return loss
# Вызовите её в контексте no_grad
with torch.no_grad():
x = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([0.0, 0.0, 0.0])
# Декоратор гарантирует, что вычисление градиента включено
loss = train_step(x, y)
print("Потери:", loss)
print("Требует градиента:", loss.requires_grad)
@torch.enable_grad()
def train_step(x, y):
"""Имитировать шаги обучения"""
# Эта функция включит вычисление градиента внутри
loss = (x - y).sum()
return loss
# Вызовите её в контексте no_grad
with torch.no_grad():
x = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([0.0, 0.0, 0.0])
# Декоратор гарантирует, что вычисление градиента включено
loss = train_step(x, y)
print("Потери:", loss)
print("Требует градиента:", loss.requires_grad)
Вывод:
Loss: tensor(6.) 需要梯度: True
Связанные функции
torch.no_grad(): Отключает вычисление градиента.torch.set_grad_enabled(grad): Включает или отключает вычисление градиента в зависимости от параметров.torch.is_grad_enabled(): Проверяет, включено ли вычисление градиентов в данный момент.
Примечания
enable_gradВ основном используется, чтобыno_gradвременно включить вычисление градиентов в контексте.- Если используется в среде, где вычисление градиентов глобально включено
enable_grad, это не даст эффекта. - Рекомендуется использовать
enable_gradдекоратор, чтобы гарантировать, что внутри функции вычисление градиентов всегда включено.
Другие расширения