Fonction torch.enable_grad de PyTorch
Manuel de référence Pytorch torch
torch.enable_gradC'est un gestionnaire de contexte dans PyTorch utilisé pour activer le calcul du gradient. Il esttorch.no_gradl'opposé, et est utilisé pour activer explicitement le calcul du gradient dans les blocs de code qui nécessitent des gradients.
C'est très utile lorsque vous devez temporairement entraîner un modèle dans du code d'inférence, ou lorsque vous devez activer le calcul du gradient dans une région locale.
Définition de fonction
torch.enable_grad()
Parameters:
- Aucun paramètre. C'est un gestionnaire de contexte.
Valeur de retour:
- Renvoie un gestionnaire de contexte qui active le calcul du gradient dans ce contexte.
Exemples d'utilisation
Exemple 1 : Utilisation de base
Exemple
import torch
# Par défaut, dans un contexte no_grad
with torch.no_grad():
x = torch.tensor([1.0, 2.0, 3.0])
print("In no_grad:", x.requires_grad)
# Utiliser enable_grad pour activer temporairement les gradients
with torch.enable_grad():
y = x * 2
print("Dans enable_grad :", y.requires_grad)
# Après la sortie, restaurer l'état no_grad
z = x * 2
print("Après la sortie :", z.requires_grad)
# Par défaut, dans un contexte no_grad
with torch.no_grad():
x = torch.tensor([1.0, 2.0, 3.0])
print("In no_grad:", x.requires_grad)
# Utiliser enable_grad pour activer temporairement les gradients
with torch.enable_grad():
y = x * 2
print("Dans enable_grad :", y.requires_grad)
# Après la sortie, restaurer l'état no_grad
z = x * 2
print("Après la sortie :", z.requires_grad)
La sortie est :
在 no_grad 中: False 在 enable_grad 中: True 退出后: False
Exemple 2 : Mélange d'entraînement et d'inférence
Exemple
import torch
import torch.nn as nn
model = nn.Linear(10, 2)
# Mode inférence
with torch.no_grad():
x = torch.randn(5, 10)
output1 = model(x)
print("Sortie d'inférence :", output1.shape)
# Si vous devez entraîner temporairement certains paramètres pendant l'inférence
with torch.enable_grad():
# Créer un tenseur qui nécessite des gradients pour le calcul
temp_weight = torch.randn(10, 10, requires_grad=True)
temp_output = torch.mm(x, temp_weight)
print("Activer temporairement les gradients :", temp_output.requires_grad)
import torch.nn as nn
model = nn.Linear(10, 2)
# Mode inférence
with torch.no_grad():
x = torch.randn(5, 10)
output1 = model(x)
print("Sortie d'inférence :", output1.shape)
# Si vous devez entraîner temporairement certains paramètres pendant l'inférence
with torch.enable_grad():
# Créer un tenseur qui nécessite des gradients pour le calcul
temp_weight = torch.randn(10, 10, requires_grad=True)
temp_output = torch.mm(x, temp_weight)
print("Activer temporairement les gradients :", temp_output.requires_grad)
La sortie est :
推理输出: torch.Size([5, 2]) 临时启用梯度: True
Exemple 3 : Utilisation comme décorateur
Exemple
import torch
@torch.enable_grad()
def train_step(x, y):
"""Simuler les étapes d'entraînement"""
# Cette fonction activera le calcul des gradients en interne
loss = (x - y).sum()
return loss
# Appelez-la dans un contexte no_grad
with torch.no_grad():
x = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([0.0, 0.0, 0.0])
# Le décorateur garantit que le calcul des gradients est activé
loss = train_step(x, y)
print("Loss:", loss)
print("Requires gradient:", loss.requires_grad)
@torch.enable_grad()
def train_step(x, y):
"""Simuler les étapes d'entraînement"""
# Cette fonction activera le calcul des gradients en interne
loss = (x - y).sum()
return loss
# Appelez-la dans un contexte no_grad
with torch.no_grad():
x = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([0.0, 0.0, 0.0])
# Le décorateur garantit que le calcul des gradients est activé
loss = train_step(x, y)
print("Loss:", loss)
print("Requires gradient:", loss.requires_grad)
La sortie est :
Loss: tensor(6.) 需要梯度: True
Fonctions associées
torch.no_grad(): Désactive le calcul des gradients.torch.set_grad_enabled(grad): Active ou désactive le calcul des gradients selon les paramètres.torch.is_grad_enabled(): Vérifie si le calcul du gradient est actuellement activé.
Notes
enable_gradPrincipalement utilisé pourno_gradactiver temporairement le calcul du gradient dans un contexte.- S'il est utilisé dans un environnement où les gradients sont globalement activés
enable_grad, cela n'aura aucun effet. - Il est recommandé d'utiliser
enable_gradle décorateur pour garantir que les gradients sont toujours activés à l'intérieur de la fonction.
Autres extensions