PyTorch torch.set_grad_enabled Funktion
PyTorch torch Referenzhandbuch
torch.set_grad_enabledist eine Funktion in PyTorch, mit der global festgelegt wird, ob die Gradientenberechnung aktiviert ist. Sie kann die Gradientenberechnung dynamisch aktivieren oder deaktivieren; im Gegensatz zu Kontextmanagern ist sie eine Funktion, die den globalen Zustand ändern kann.
Dies ist sehr nützlich, wenn Sie die Gradientenberechnung abhängig von Bedingungen dynamisch steuern müssen.
Funktionsdefinition
torch.set_grad_enabled(mode)
Parameters:
mode(bool): Wenn erTrueist, Gradientenberechnung aktivieren; wenn erFalseist, Gradientenberechnung deaktivieren.
Rückgabewert:
- Gibt einen Kontextmanager zurück, der in
withAnweisungen verwendet werden kann.
Anwendungsbeispiele
Beispiel 1: Grundlegende Verwendung
Beispiel
import torch
# Erstelle einen Tensor, der Gradienten benötigt
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
# Gradientenberechnung deaktivieren
torch.set_grad_enabled(False)
y1 = x * 2
print("Nach dem Deaktivieren der Gradienten:", y1.requires_grad)
# Gradientenberechnung aktivieren
torch.set_grad_enabled(True)
y2 = x * 2
print("Nach dem Aktivieren der Gradienten:", y2.requires_grad)
# Erstelle einen Tensor, der Gradienten benötigt
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
# Gradientenberechnung deaktivieren
torch.set_grad_enabled(False)
y1 = x * 2
print("Nach dem Deaktivieren der Gradienten:", y1.requires_grad)
# Gradientenberechnung aktivieren
torch.set_grad_enabled(True)
y2 = x * 2
print("Nach dem Aktivieren der Gradienten:", y2.requires_grad)
Die Ausgabe ist:
禁用梯度后: False 启用梯度后: True
Beispiel 2: Verwendung als Kontextmanager
Beispiel
import torch
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
# Einen Kontextmanager verwenden
with torch.set_grad_enabled(False):
y1 = x * 2
print("Innerhalb des Kontextmanagers:", y1.requires_grad)
y2 = x * 2
print("Außerhalb des Kontextmanagers:", y2.requires_grad)
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
# Einen Kontextmanager verwenden
with torch.set_grad_enabled(False):
y1 = x * 2
print("Innerhalb des Kontextmanagers:", y1.requires_grad)
y2 = x * 2
print("Außerhalb des Kontextmanagers:", y2.requires_grad)
Die Ausgabe ist:
在上下文管理器内: False 在上下文管理器外: True
Beispiel 3: Dynamisches Steuern von Training und Inferenz
Beispiel
import torch
import torch.nn as nn
model = nn.Linear(10, 2)
def forward_pass(x, training=True):
"""Steuere Gradienten basierend auf dem Trainingsparameter"""
with torch.set_grad_enabled(training):
output = model(x)
print(f"training={training}, requires_grad={output.requires_grad}")
return output
# Trainingsmodus
x = torch.randn(5, 10)
forward_pass(x, training=True)
# Inferenzmodus
forward_pass(x, training=False)
import torch.nn as nn
model = nn.Linear(10, 2)
def forward_pass(x, training=True):
"""Steuere Gradienten basierend auf dem Trainingsparameter"""
with torch.set_grad_enabled(training):
output = model(x)
print(f"training={training}, requires_grad={output.requires_grad}")
return output
# Trainingsmodus
x = torch.randn(5, 10)
forward_pass(x, training=True)
# Inferenzmodus
forward_pass(x, training=False)
Die Ausgabe ist:
training=True, requires_grad=True training=False, requires_grad=False
Beispiel 4: Speichern und Wiederherstellen des Gradientenzustands
Beispiel
import torch
# Anfangszustand
print("Anfangszustand:", torch.is_grad_enabled())
# Erstelle einen Kontextmanager, der zum ursprünglichen Zustand zurückkehrt
old = torch.is_grad_enabled()
# Gradienten vorübergehend deaktivieren
with torch.set_grad_enabled(False):
print("Inside:", torch.is_grad_enabled())
# Automatisch wiederherstellen (aber hier müssen wir manuell wiederherstellen)
torch.set_grad_enabled(old)
print("After restoration:", torch.is_grad_enabled())
# Anfangszustand
print("Anfangszustand:", torch.is_grad_enabled())
# Erstelle einen Kontextmanager, der zum ursprünglichen Zustand zurückkehrt
old = torch.is_grad_enabled()
# Gradienten vorübergehend deaktivieren
with torch.set_grad_enabled(False):
print("Inside:", torch.is_grad_enabled())
# Automatisch wiederherstellen (aber hier müssen wir manuell wiederherstellen)
torch.set_grad_enabled(old)
print("After restoration:", torch.is_grad_enabled())
Die Ausgabe ist:
初始状态: True 在内部: False 恢复后: True
Verwandte Funktionen
torch.no_grad(): Kontextmanager, der die Gradientenberechnung deaktiviert.torch.enable_grad(): Kontextmanager, der die Gradientenberechnung ermöglicht.torch.is_grad_enabled(): Prüft, ob die Gradientenberechnung derzeit aktiviert ist.
Hinweise
set_grad_enabledSie kann direkt als Funktion aufgerufen werden, um den globalen Zustand zu ändern, oder als Kontextmanager verwendet werden.- Wenn sie als Funktion aufgerufen wird, müssen Sie den ursprünglichen Zustand manuell wiederherstellen, andernfalls wirkt sich dies auf den nachfolgenden Code aus.
- Es wird empfohlen, den Kontextmanager-Ansatz zu verwenden, um sicherzustellen, dass der Zustand korrekt wiederhergestellt wird.
- Beachten Sie die Auswirkungen auf den globalen Zustand und setzen Sie sie in komplexem Code mit Vorsicht ein.
Andere Erweiterungen