PyTorch nn.MaxPool2d-Funktion

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

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

Andere Erweiterungen