Función PyTorch torch.is_grad_enabled
Manual de referencia de Pytorch torch
torch.is_grad_enabledEs una función en PyTorch que se utiliza para comprobar si el cálculo de gradientes está actualmente habilitado. Devuelve un valor booleano que indica si la función de cálculo de gradientes actual de PyTorch está habilitada o deshabilitada.
Esto es muy útil al escribir código que necesita ejecutar diferente lógica según el estado del gradiente.
Definición de la función
torch.is_grad_enabled()
Parámetros:
- Sin parámetros.
Valor de retorno:
- Devuelve un valor booleano: si el cálculo de gradientes está actualmente habilitado, devuelve
True; de lo contrario, devuelveFalse。
Ejemplos de uso
Ejemplo 1: Uso básico
Ejemplo
import torch
# De forma predeterminada, el cálculo de gradientes está habilitado
print("Estado predeterminado:", torch.is_grad_enabled())
# En el contexto no_grad
with torch.no_grad():
print("Dentro de no_grad:", torch.is_grad_enabled())
# Se restaura después de salir
print("Después de salir de no_grad:", torch.is_grad_enabled())
# De forma predeterminada, el cálculo de gradientes está habilitado
print("Estado predeterminado:", torch.is_grad_enabled())
# En el contexto no_grad
with torch.no_grad():
print("Dentro de no_grad:", torch.is_grad_enabled())
# Se restaura después de salir
print("Después de salir de no_grad:", torch.is_grad_enabled())
El resultado de salida es:
默认状态: True 在 no_grad 中: False 退出 no_grad 后: True
Ejemplo 2: Uso combinado con set_grad_enabled
Ejemplo
import torch
# Comprobar el estado actual
print("Estado actual:", torch.is_grad_enabled())
# Deshabilitar el gradiente
torch.set_grad_enabled(False)
print("Después de deshabilitar:", torch.is_grad_enabled())
# Habilitar el gradiente
torch.set_grad_enabled(True)
print("Después de habilitar:", torch.is_grad_enabled())
# Comprobar el estado actual
print("Estado actual:", torch.is_grad_enabled())
# Deshabilitar el gradiente
torch.set_grad_enabled(False)
print("Después de deshabilitar:", torch.is_grad_enabled())
# Habilitar el gradiente
torch.set_grad_enabled(True)
print("Después de habilitar:", torch.is_grad_enabled())
El resultado de salida es:
当前状态: True 禁用后: False 启用后: True
Ejemplo 3: Uso en sentencias condicionales
Ejemplo
import torch
def process_tensor(x):
"""Procesa tensores según el estado del gradiente"""
if torch.is_grad_enabled():
print("Cálculo de gradientes habilitado")
# Se puede realizar la retropropagación
y = x * 2
return y
else:
print("Cálculo de gradientes deshabilitado")
# Cálculo rápido que ahorra memoria
y = x * 2
return y
# Probar diferentes estados
x = torch.tensor([1.0, 2.0, 3.0])
print("=== Gradiente habilitado ===")
result1 = process_tensor(x)
print("n=== Gradiente deshabilitado ===")
with torch.no_grad():
result2 = process_tensor(x)
def process_tensor(x):
"""Procesa tensores según el estado del gradiente"""
if torch.is_grad_enabled():
print("Cálculo de gradientes habilitado")
# Se puede realizar la retropropagación
y = x * 2
return y
else:
print("Cálculo de gradientes deshabilitado")
# Cálculo rápido que ahorra memoria
y = x * 2
return y
# Probar diferentes estados
x = torch.tensor([1.0, 2.0, 3.0])
print("=== Gradiente habilitado ===")
result1 = process_tensor(x)
print("n=== Gradiente deshabilitado ===")
with torch.no_grad():
result2 = process_tensor(x)
El resultado de salida es:
=== Habilitar gradiente === Habilitar el cálculo de gradientes === Deshabilitar gradiente === Deshabilitar el cálculo de gradientes
Ejemplo 4: Uso en capas personalizadas
Ejemplo
import torch
import torch.nn as nn
class CustomLayer(nn.Module):
def __init__(self):
super().__init__()
self.weight = nn.Parameter(torch.randn(10, 10))
def forward(self, x):
# Comprobar el estado del gradiente para un manejo diferente
if torch.is_grad_enabled():
print("Modo entrenamiento")
# Cálculo normal durante el entrenamiento
return torch.mm(x, self.weight)
else:
print("Modo inferencia")
# Durante la inferencia se puede usar una versión optimizada
with torch.no_grad():
return torch.mm(x, self.weight)
layer = CustomLayer()
x = torch.randn(5, 10)
# Entrenamiento
layer.train()
output1 = layer(x)
# Inferencia
layer.eval()
with torch.no_grad():
output2 = layer(x)
import torch.nn as nn
class CustomLayer(nn.Module):
def __init__(self):
super().__init__()
self.weight = nn.Parameter(torch.randn(10, 10))
def forward(self, x):
# Comprobar el estado del gradiente para un manejo diferente
if torch.is_grad_enabled():
print("Modo entrenamiento")
# Cálculo normal durante el entrenamiento
return torch.mm(x, self.weight)
else:
print("Modo inferencia")
# Durante la inferencia se puede usar una versión optimizada
with torch.no_grad():
return torch.mm(x, self.weight)
layer = CustomLayer()
x = torch.randn(5, 10)
# Entrenamiento
layer.train()
output1 = layer(x)
# Inferencia
layer.eval()
with torch.no_grad():
output2 = layer(x)
El resultado de salida es:
Modo de entrenamiento Modo de inferencia
Funciones relacionadas
torch.no_grad(): Administrador de contexto que deshabilita el cálculo de gradientes.torch.enable_grad(): Administrador de contexto que habilita el cálculo de gradientes.torch.set_grad_enabled(grad): Establece si el cálculo de gradientes está habilitado.
Notas
is_grad_enabledEs una función de solo lectura y no cambia ningún estado.- Comprueba el estado global del cálculo de gradientes, no el
requires_gradatributo de un tensor individual. - Al escribir código de uso general, se puede usar esta función para ejecutar diferentes estrategias de optimización según el estado actual.
Otras extensiones