PyTorch torch.enable_grad Funktion
PyTorch torch Referenzhandbuch
torch.enable_gradEs ist ein Kontextmanager in PyTorch, der verwendet wird, um die Gradientenberechnung zu ermöglichen. Er isttorch.no_graddas Gegenteil und wird verwendet, um die Gradientenberechnung in Codeblöcken, die Gradienten erfordern, explizit zu aktivieren.
Dies ist sehr nützlich, wenn Sie vorübergehend ein Modell in Inferenzcode trainieren müssen oder wenn Sie die Gradientenberechnung in einem lokalen Bereich aktivieren müssen.
Funktionsdefinition
torch.enable_grad()
Parameters:
- Keine Parameter. Dies ist ein Kontextmanager.
Rückgabewert:
- Gibt einen Kontextmanager zurück, der die Gradientenberechnung in diesem Kontext ermöglicht.
Anwendungsbeispiele
Beispiel 1: Grundlegende Verwendung
Beispiel
import torch
# Standardmäßig in einem no_grad-Kontext
with torch.no_grad():
x = torch.tensor([1.0, 2.0, 3.0])
print("In no_grad:", x.requires_grad)
# Verwende enable_grad, um Gradienten vorübergehend zu aktivieren
with torch.enable_grad():
y = x * 2
print("In enable_grad:", y.requires_grad)
# Nach dem Verlassen den no_grad-Zustand wiederherstellen
z = x * 2
print("Nach dem Verlassen:", z.requires_grad)
# Standardmäßig in einem no_grad-Kontext
with torch.no_grad():
x = torch.tensor([1.0, 2.0, 3.0])
print("In no_grad:", x.requires_grad)
# Verwende enable_grad, um Gradienten vorübergehend zu aktivieren
with torch.enable_grad():
y = x * 2
print("In enable_grad:", y.requires_grad)
# Nach dem Verlassen den no_grad-Zustand wiederherstellen
z = x * 2
print("Nach dem Verlassen:", z.requires_grad)
Die Ausgabe ist:
在 no_grad 中: False 在 enable_grad 中: True 退出后: False
Beispiel 2: Training und Inferenz mischen
Beispiel
import torch
import torch.nn as nn
model = nn.Linear(10, 2)
# Inferenzmodus
with torch.no_grad():
x = torch.randn(5, 10)
output1 = model(x)
print("Inferenzausgabe:", output1.shape)
# Wenn Sie während der Inferenz vorübergehend einige Parameter trainieren müssen
with torch.enable_grad():
# Erstellen Sie einen Tensor, der für die Berechnung Gradienten benötigt
temp_weight = torch.randn(10, 10, requires_grad=True)
temp_output = torch.mm(x, temp_weight)
print("Gradienten vorübergehend aktivieren:", temp_output.requires_grad)
import torch.nn as nn
model = nn.Linear(10, 2)
# Inferenzmodus
with torch.no_grad():
x = torch.randn(5, 10)
output1 = model(x)
print("Inferenzausgabe:", output1.shape)
# Wenn Sie während der Inferenz vorübergehend einige Parameter trainieren müssen
with torch.enable_grad():
# Erstellen Sie einen Tensor, der für die Berechnung Gradienten benötigt
temp_weight = torch.randn(10, 10, requires_grad=True)
temp_output = torch.mm(x, temp_weight)
print("Gradienten vorübergehend aktivieren:", temp_output.requires_grad)
Die Ausgabe ist:
推理输出: torch.Size([5, 2]) 临时启用梯度: True
Beispiel 3: Verwendung als Dekorator
Beispiel
import torch
@torch.enable_grad()
def train_step(x, y):
"""Simuliere Trainingsschritte"""
# Diese Funktion aktiviert intern die Gradientenberechnung
loss = (x - y).sum()
return loss
# In einem no_grad-Kontext aufrufen
with torch.no_grad():
x = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([0.0, 0.0, 0.0])
# Der Dekorator stellt sicher, dass die Gradientenberechnung aktiviert ist
loss = train_step(x, y)
print("Verlust:", loss)
print("Benötigt Gradient:", loss.requires_grad)
@torch.enable_grad()
def train_step(x, y):
"""Simuliere Trainingsschritte"""
# Diese Funktion aktiviert intern die Gradientenberechnung
loss = (x - y).sum()
return loss
# In einem no_grad-Kontext aufrufen
with torch.no_grad():
x = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([0.0, 0.0, 0.0])
# Der Dekorator stellt sicher, dass die Gradientenberechnung aktiviert ist
loss = train_step(x, y)
print("Verlust:", loss)
print("Benötigt Gradient:", loss.requires_grad)
Die Ausgabe ist:
Loss: tensor(6.) 需要梯度: True
Verwandte Funktionen
torch.no_grad(): Deaktiviert die Gradientenberechnung.torch.set_grad_enabled(grad): Aktiviert oder deaktiviert die Gradientenberechnung gemäß den Parametern.torch.is_grad_enabled(): Prüft, ob die Gradientenberechnung derzeit aktiviert ist.
Hinweise
enable_gradWird hauptsächlich verwendet, umno_graddie Gradientenberechnung vorübergehend in einem Kontext zu aktivieren.- Wenn es in einer Umgebung verwendet wird, in der Gradienten global aktiviert sind
enable_grad, hat es keine Wirkung. - Es wird empfohlen, zu verwenden
enable_gradder Dekorator, um sicherzustellen, dass Gradienten innerhalb der Funktion immer aktiviert sind.
Andere Erweiterungen