PyTorch nn.MaxPool2d-Funktion
PyTorch torch.nn Referenzhandbuch
torch.nn.MaxPool2dEs ist ein Modul in PyTorch für 2D-Max-Pooling.
Die Pooling-Schicht kann die räumliche Größe von Feature-Maps reduzieren, die Berechnung verringern und ein gewisses Maß an Translationsinvarianz bieten.
Funktionsdefinition
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
Parameterbeschreibung:
kernel_size(int oder tuple): Die Größe des Pooling-Fensters.stride(int oder tuple): Die Schrittweite der Bewegung des Pooling-Fensters. Standardwert istkernel_size。padding(int oder tuple): Die Padding-Größe am Eingaberand. Standardwert ist 0.dilation(int oder tuple): Der Abstand zwischen Fensterelementen. Standardwert ist 1.return_indices(bool): Ob die Indizes der Maximalwerte zurückgegeben werden sollen. Wird für MaxUnpool2d verwendet. Standardwert ist False.ceil_mode(bool): Ob ceil anstelle von floor verwendet werden soll, um die Ausgabegröße zu berechnen. Standardwert ist False.
Anwendungsbeispiele
Beispiel 1: Grundlegende Verwendung
Erstellen einer Max-Pooling-Schicht:
Beispiel
import torch.nn as nn
# Erstellen einer Max-Pooling-Schicht: Fenster 2x2, Schrittweite 2
max_pool = nn.MaxPool2d(kernel_size=2, stride=2)
# Eingabe-Tensor erstellen
input_tensor = torch.randn(1, 1, 4, 4)
print("Input:n", input_tensor.squeeze().tolist())
# Vorwärtspropagierung
output = max_pool(input_tensor)
print("nAusgabe:n", output.squeeze().tolist())
print("Eingabe-Form:", input_tensor.shape)
print("Ausgabeform:", output.shape)
Die Ausgabe ist:
输入: [[-0.4128, 0.2341, -0.9876, 0.4567], [ 0.1234, 0.8765, -0.2345, 0.6789], [-0.5678, 0.3456, 0.7890, -0.1234], [ 0.9012, -0.4567, 0.2345, 0.5678]] 输出: [[0.8765, 0.6789], [0.9012, 0.7890]] 输入形状: torch.Size([1, 1, 4, 4]) 输出形状: torch.Size([1, 1, 2, 2])
Es ist zu erkennen, dass der Maximalwert in jedem 2x2-Fenster beibehalten wird.
Beispiel 2: Unterschiedliche kernel_size und stride
Passen Sie die Pooling-Parameter an:
Beispiel
import torch.nn as nn
# 3x3-Pooling, stride 1 (nicht überlappend)
pool3x3 = nn.MaxPool2d(kernel_size=3, stride=1)
# Nicht-quadratisches Pooling
pool_rect = nn.MaxPool2d(kernel_size=(2, 3), stride=(2, 3))
input_tensor = torch.randn(1, 1, 6, 9)
print("Eingabeform:", input_tensor.shape)
print("3x3-Pooling-Ausgabe:", pool3x3(input_tensor).shape)
print("Rechteckige Pooling-Ausgabe:", pool_rect(input_tensor).shape)
Beispiel 3: Verwendung von Padding
Rand-Padding kann Randinformationen bis zu einem gewissen Grad bewahren:
Beispiel
import torch.nn as nn
# Pooling mit Padding
pool_padding = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)
input_tensor = torch.randn(1, 1, 4, 4)
output = pool_padding(input_tensor)
print("Eingabeform:", input_tensor.shape)
print("Ausgabeform (mit Padding):", output.shape)
Beispiel 4: Indizes zurückgeben
Mit return_indices können Positionen im Decoder wiederhergestellt werden:
Beispiel
import torch.nn as nn
# Eine Pooling-Schicht erstellen, die Indizes zurückgibt
pool_indices = nn.MaxPool2d(kernel_size=2, stride=2, return_indices=True)
input_tensor = torch.randn(1, 1, 4, 4)
output, indices = pool_indices(input_tensor)
print("Ausgabeform:", output.shape)
print("Index-Form:", indices.shape)
print("Indexwerte:", indices.squeeze().tolist())
Beispiel 5: Verwendung in CNN
Die Position der Pooling-Schicht in einer typischen CNN-Struktur:
Beispiel
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
# Faltungsschicht
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
self.relu = nn.ReLU()
# Pooling-Schicht: Die Größe wird jedes Mal halbiert
self.pool = nn.MaxPool2d(2, 2)
def forward(self, x):
x = self.relu(self.conv1(x)) # 32x32
x = self.pool(x) # 16x16
x = self.relu(self.conv2(x)) # 16x16
x = self.pool(x) # 8x8
return x
model = SimpleCNN()
input_image = torch.randn(1, 3, 32, 32)
output = model(input_image)
print("Eingabeform:", input_image.shape)
print("Ausgabeform:", output.shape)
Max-Pooling vs. Average-Pooling
| Type | Formel | Funktionen | Anwendungsfälle |
|---|---|---|---|
MaxPool2d |
max(region) | Behält wichtige Merkmale bei und ist robuster gegenüber Rauschen | Bildklassifizierung, Objekterkennung (häufig verwendet) |
AvgPool2d |
mean(region) | Glättet Merkmale und bewahrt Hintergrundinformationen | Global Average Pooling, Merkmalsextraktion |
FAQ
F1: Kann die Pooling-Schicht entfernt werden?
Moderne Netzwerke wie ResNet und DenseNet neigen dazu, Faltungen mit kleinerem stride anstelle von Pooling zu verwenden, aber Pooling wird noch häufig für schnelles Downsampling eingesetzt.
F2: Was ist die Beziehung zwischen stride und kernel_size?
Wenn stride = kernel_size, überlappen sich die Pooling-Fenster nicht; wenn stride < kernel_size, überlappen sich die Pooling-Fenster.
Anwendungsfälle
nn.MaxPool2dDie wichtigsten Anwendungsszenarien umfassen:
- Image classification networks: Auflösung schrittweise reduzieren und High-Level-Merkmale extrahieren
- Object detection: Hervorstechende Merkmalspositionen beibehalten
- Reduce computation: Die Größe der Feature-Maps reduzieren
- Increase receptive field: Nachfolgenden Schichten ermöglichen, einen größeren Bereich von Merkmalen zu sehen
Andere Erweiterungen