PyTorch torch.nn.Dropout-Funktion
PyTorch torch.nn Referenzhandbuch
torch.nn.DropoutEs ist ein Modul in PyTorch, das zur Regularisierung verwendet wird.
Es verhindert Overfitting, indem es Eingabeelemente zufällig auf null setzt, um die Co-Adaption zwischen Neuronen zu reduzieren.
Funktionsdefinition
torch.nn.Dropout(p=0.5, inplace=False)
Parameterbeschreibung:
p(float): Die Wahrscheinlichkeit, dass jedes Element auf null gesetzt wird. Standardwert ist 0.5.inplace(bool): Gibt an, ob die Operation in-place ausgeführt werden soll. Standardwert ist False.
Anwendungsbeispiele
Beispiel 1: Grundlegende Verwendung
Eine Dropout-Schicht erstellen und verwenden:
Beispiel
import torch.nn as nn
# Dropout-Schicht mit Dropout-Wahrscheinlichkeit 0.5 erstellen
dropout = nn.Dropout(p=0.5)
# Trainingsmodus (Dropout aktiv)
dropout.train()
# Eingabe erstellen
input_tensor = torch.ones(1, 10)
print("Eingabe:", input_tensor.squeeze().tolist())
# Mehrere Vorwärtsdurchläufe ausführen, Zufälligkeit beobachten
for i in range(3):
output = dropout(input_tensor)
print(f"Ausgabe {i+1}:", output.squeeze().tolist())
Es ist zu erkennen, dass bei jedem Aufruf ungefähr die Hälfte der Elemente zufällig auf null gesetzt wird.
Beispiel 2: Trainings- vs. Evaluierungsmodus
Dropout verhält sich während des Trainings und der Evaluierung unterschiedlich:
Beispiel
import torch.nn as nn
dropout = nn.Dropout(p=0.5)
# Trainingsmodus
dropout.train()
train_output = dropout(torch.ones(4, 10))
print("Trainingsmodus - Aktivierungsverhältnis:", (train_output != 0).float().mean().item())
# Evaluierungsmodus
dropout.eval()
eval_output = dropout(torch.ones(4, 10))
print("Evaluierungsmodus - Aktivierungsverhältnis:", (eval_output != 0).float().mean().item())
print("Ausgabe im Evaluierungsmodus:", eval_output[0].tolist())
Während der Evaluierung hat Dropout keine Auswirkung, und die Ausgabe bleibt unverändert.
Beispiel 3: Verwendung in neuronalen Netzen
Ein typisches vollständig verbundenes Netzwerk mit Dropout:
Beispiel
import torch.nn as nn
class DropoutNet(nn.Module):
def __init__(self, input_dim=784, hidden_dim=256, output_dim=10, dropout_rate=0.5):
super(DropoutNet, self).__init__()
self.fc1 = nn.Linear(input_dim, hidden_dim)
self.dropout1 = nn.Dropout(p=dropout_rate)
self.fc2 = nn.Linear(hidden_dim, hidden_dim)
self.dropout2 = nn.Dropout(p=dropout_rate)
self.fc3 = nn.Linear(hidden_dim, output_dim)
self.relu = nn.ReLU()
def forward(self, x):
x = self.relu(self.fc1(x))
x = self.dropout1(x) # Erster Dropout
x = self.relu(self.fc2(x))
x = self.dropout2(x) # Zweiter Dropout
x = self.fc3(x)
return x
model = DropoutNet()
# Trainingsmodus
model.train()
input_data = torch.randn(32, 784)
output = model(input_data)
print("Ausgabeform im Trainingsmodus:", output.shape)
# Evaluierungsmodus
model.eval()
output = model(input_data)
print("Ausgabeform im Evaluierungsmodus:", output.shape)
Beispiel 4: Verwendung von Dropout2d in CNN
nn.Dropout2dGesamte Feature-Maps kanalweise verwerfen:
Beispiel
import torch.nn as nn
# Dropout2d verwirft kanalweise
dropout2d = nn.Dropout2d(p=0.5)
# Eingabe: Batch=1, Kanäle=4, Höhe=4, Breite=4
input_tensor = torch.ones(1, 4, 4, 4)
dropout2d.train()
output = dropout2d(input_tensor)
print("Ausgabeform von Dropout2d:", output.shape)
print("Anzahl der Nicht-Null-Kanäle:", (output.sum(dim=(2, 3)) != 0).sum().item())
Beispiel 5: Auswirkungen unterschiedlicher Dropout-Raten
Die Auswirkung der Dropout-Rate auf das Netzwerk:
Beispiel
import torch.nn as nn
for p in [0.1, 0.3, 0.5, 0.7]:
dropout = nn.Dropout(p=p)
dropout.train()
# Durchschnitt über mehrere Durchläufe
total_active = 0
for _ in range(100):
output = dropout(torch.ones(1000))
total_active += (output != 0).float().sum().item()
avg_active = total_active / 100 / 1000
print(f"p={p} - average activation ratio: {avg_active:.2%} (expected: {1-p:.2%})")
Vergleich der Dropout-Typen
| Type | Dropout-Methode | Geeignete Szenarien |
|---|---|---|
nn.Dropout |
Einzelne Elemente zufällig auf null setzen | Vollständig verbundene Schichten, Feature-Vektoren |
nn.Dropout2d |
Zufälliges Nullsetzen ganzer Kanäle | Feature-Maps der Faltungsschicht |
nn.Dropout3d |
Zufälliges Nullsetzen ganzer 3D-Kanäle | 3D-Faltungsmerkmale |
FAQ
Q1: Wie wählt man die Dropout-Rate?
- 0.1-0.3: Leichtere Regularisierung, geeignet für große Datensätze
- 0.4-0.5: Übliche Standardwerte
- 0.5+: Stärkere Regularisierung, geeignet für kleine Datensätze
Q2: Wo sollte Dropout platziert werden?
Üblicherweise wird Dropout nach der vollständig verbundenen Schicht und nach der Aktivierungsfunktion platziert. Es kann auch vor der Aktivierungsfunktion platziert werden.
Q3: Muss ich Dropout während der Evaluierung deaktivieren?
Ja, verwenden Sie bei der Evaluierung `model.eval()`model.eval()um Dropout automatisch zu deaktivieren.
Anwendungsfälle
nn.DropoutHauptanwendungsfälle sind:
- Überanpassung verhindern: Abhängigkeit zwischen Neuronen verringern
- Modell-Ensembling: Den Effekt mehrerer Netzwerke approximieren
- Vollständig verbundene Schichten: Am häufigsten in FC-Schichten verwendet
- Feature-Dropout: Modellrobustheit verbessern
Hinweis: Dropout ist während des Trainings aktiviert; während der Evaluierung unbedingt in den Eval-Modus wechseln, andernfalls ist die Ausgabe instabil.
Andere Erweiterungen