Función PyTorch nn.MaxPool2d
Manual de referencia de PyTorch torch.nn
torch.nn.MaxPool2dEs el módulo de PyTorch para max pooling 2D.
La capa de pooling puede reducir las dimensiones espaciales del mapa de características, disminuir la cantidad de cálculo y proporcionar cierto grado de invariancia a la traslación.
Definición de la función
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
Descripción de parámetros:
kernel_size(int o tuple): El tamaño de la ventana de pooling.stride(int o tuple): El stride de desplazamiento de la ventana de pooling. Por defecto eskernel_size。padding(int o tuple): El tamaño del padding en los bordes de entrada. Por defecto es 0.dilation(int o tuple): El espaciado entre elementos de la ventana. Por defecto es 1.return_indices(bool): Si devolver los índices del valor máximo. Se usa para MaxUnpool2d. Por defecto es False.ceil_mode(bool): Si usar ceil en lugar de floor para calcular el tamaño de salida. Por defecto es False.
Ejemplo de uso
Ejemplo 1: Uso básico
Crear una capa de max pooling:
Ejemplo
import torch.nn as nn
# Crear capa de max pooling: ventana 2x2, stride 2
max_pool = nn.MaxPool2d(kernel_size=2, stride=2)
# Crear tensor de entrada
input_tensor = torch.randn(1, 1, 4, 4)
print("Entrada:\n", input_tensor.squeeze().tolist())
# Propagación hacia adelante
output = max_pool(input_tensor)
print("\nSalida:\n", output.squeeze().tolist())
print("\nForma de entrada:", input_tensor.shape)
print("Forma de salida:", output.shape)
El resultado de salida es:
输入: [[-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])
Se puede ver que se conserva el valor máximo de cada ventana de 2x2.
Ejemplo 2: Diferentes kernel_size y stride
Ajustar los parámetros de pooling:
Ejemplo
import torch.nn as nn
# Pooling 3x3, stride de 1 (sin solapamiento)
pool3x3 = nn.MaxPool2d(kernel_size=3, stride=1)
# Pooling no cuadrado
pool_rect = nn.MaxPool2d(kernel_size=(2, 3), stride=(2, 3))
input_tensor = torch.randn(1, 1, 6, 9)
print("Forma de entrada:", input_tensor.shape)
print("Salida de pooling 3x3:", pool3x3(input_tensor).shape)
print("Salida de pooling rectangular:", pool_rect(input_tensor).shape)
Ejemplo 3: Uso de padding
El padding de bordes puede preservar en cierta medida la información de los bordes:
Ejemplo
import torch.nn as nn
# Pooling con 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("Forma de entrada:", input_tensor.shape)
print("Forma de salida (con padding):", output.shape)
Ejemplo 4: Devolver índices
El uso de return_indices permite recuperar posiciones en el decodificador:
Ejemplo
import torch.nn as nn
# Crear capa de pooling que devuelve índices
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("Forma de salida:", output.shape)
print("Forma de los índices:", indices.shape)
print("Valores de los índices:", indices.squeeze().tolist())
Ejemplo 5: Uso en CNN
Posición de la capa de pooling en una estructura CNN típica:
Ejemplo
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
# Capa convolucional
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()
# Capa de pooling: cada vez que se aplica, el tamaño se reduce a la mitad
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("Forma de entrada:", input_image.shape)
print("Forma de salida:", output.shape)
Max Pooling vs Average Pooling
| Tipo | Fórmula | Características | Escenarios de aplicación |
|---|---|---|---|
MaxPool2d |
max(región) | Conserva características prominentes y es más robusto al ruido | Clasificación de imágenes, detección de objetos (común) |
AvgPool2d |
mean(región) | Suaviza características y conserva información de fondo | Average pooling global, extracción de características |
Preguntas frecuentes
Q1: ¿Se puede eliminar la capa de pooling?
Redes modernas como ResNet y DenseNet tienden a usar convoluciones con stride menor en lugar de pooling, pero el pooling todavía se usa a menudo para un downsampling rápido.
Q2: ¿Qué relación hay entre stride y kernel_size?
Cuando stride = kernel_size, las ventanas de pooling no se superponen; cuando stride < kernel_size, las ventanas de pooling se superponen.
Escenarios de uso
nn.MaxPool2dLos escenarios de aplicación principales incluyen:
- Redes de clasificación de imágenes: Reducir gradualmente la resolución y extraer características de alto nivel
- Detección de objetos: Conservar posiciones de características prominentes
- Reducir la cantidad de cálculo: Reducir el tamaño del mapa de características
- Aumentar el campo receptivo: Permitir que las capas posteriores vean características en un rango más amplio
Otras extensiones