Функция PyTorch torch.enable_grad


Pytorch torch 参考手册Справочное руководство 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 中: 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)

Вывод:

推理输出: 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)

Вывод:

Loss: tensor(6.)
需要梯度: True

Связанные функции

  • torch.no_grad(): Отключает вычисление градиента.
  • torch.set_grad_enabled(grad): Включает или отключает вычисление градиента в зависимости от параметров.
  • torch.is_grad_enabled(): Проверяет, включено ли вычисление градиентов в данный момент.

Примечания

  • enable_gradВ основном используется, чтобыno_gradвременно включить вычисление градиентов в контексте.
  • Если используется в среде, где вычисление градиентов глобально включеноenable_grad, это не даст эффекта.
  • Рекомендуется использоватьenable_gradдекоратор, чтобы гарантировать, что внутри функции вычисление градиентов всегда включено.

Pytorch torch 参考手册Справочное руководство Pytorch torch

Другие расширения