PyTorch torch.set_grad_enabled Funktion


Pytorch torch 参考手册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 inwithAnweisungen 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)

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)

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)

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())

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.

Pytorch torch 参考手册PyTorch torch Referenzhandbuch

Andere Erweiterungen