PyTorch torch.nn.Dropout-Funktion

PyTorch torch.nn 参考手册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
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
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
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
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
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.


PyTorch torch.nn 参考手册PyTorch torch.nn Referenzhandbuch

Andere Erweiterungen