Función PyTorch torch.nn.AdaptiveAvgPool2d
Manual de referencia de PyTorch torch.nn
torch.nn.AdaptiveAvgPool2dEs el módulo de agrupación promedio adaptativa en PyTorch.
Puede agrupar mapas de características de entrada de cualquier tamaño a un tamaño objetivo específico, sin necesidad de calcular manualmente kernel_size y stride.
Definición de la función
torch.nn.AdaptiveAvgPool2d(output_size)
Descripción de parámetros:
output_size(int o tuple): Tamaño de salida. Puede ser (H, W) o un solo int (cuadrado).
Ejemplo de uso
Ejemplo 1: Uso básico
Agrupar el mapa de características a un tamaño fijo:
Ejemplo
import torch
import torch.nn as nn
# Agrupar a 1x1
adaptive_pool = nn.AdaptiveAvgPool2d(1)
# Entrada de diferentes tamaños
x1 = torch.randn(1, 64, 32, 32)
x2 = torch.randn(1, 64, 16, 16)
x3 = torch.randn(1, 64, 8, 8)
out1 = adaptive_pool(x1)
out2 = adaptive_pool(x2)
out3 = adaptive_pool(x3)
print("32x32 ->", out1.shape)
print("16x16 ->", out2.shape)
print("8x8 ->", out3.shape)
print("nTodas las salidas se agrupan a 1x1")
import torch.nn as nn
# Agrupar a 1x1
adaptive_pool = nn.AdaptiveAvgPool2d(1)
# Entrada de diferentes tamaños
x1 = torch.randn(1, 64, 32, 32)
x2 = torch.randn(1, 64, 16, 16)
x3 = torch.randn(1, 64, 8, 8)
out1 = adaptive_pool(x1)
out2 = adaptive_pool(x2)
out3 = adaptive_pool(x3)
print("32x32 ->", out1.shape)
print("16x16 ->", out2.shape)
print("8x8 ->", out3.shape)
print("nTodas las salidas se agrupan a 1x1")
Ejemplo 2: Salida de cualquier tamaño
Agrupar a un tamaño no cuadrado:
Ejemplo
import torch
import torch.nn as nn
# Agrupar a 4x4
pool = nn.AdaptiveAvgPool2d((4, 4))
x = torch.randn(2, 128, 32, 32)
out = pool(x)
print("Forma de entrada:", x.shape)
print("Forma de salida:", out.shape) # (2, 128, 4, 4)
# Agrupar a 1x7 (útil para secuencias)
pool_seq = nn.AdaptiveAvgPool2d((1, 7))
x_seq = torch.randn(2, 64, 10, 20)
out_seq = pool_seq(x_seq)
print("nAgrupación de secuencias:", x_seq.shape, "->", out_seq.shape)
import torch.nn as nn
# Agrupar a 4x4
pool = nn.AdaptiveAvgPool2d((4, 4))
x = torch.randn(2, 128, 32, 32)
out = pool(x)
print("Forma de entrada:", x.shape)
print("Forma de salida:", out.shape) # (2, 128, 4, 4)
# Agrupar a 1x7 (útil para secuencias)
pool_seq = nn.AdaptiveAvgPool2d((1, 7))
x_seq = torch.randn(2, 64, 10, 20)
out_seq = pool_seq(x_seq)
print("nAgrupación de secuencias:", x_seq.shape, "->", out_seq.shape)
Ejemplo 3: Uso en CNN
Agrupación promedio global típica:
Ejemplo
import torch
import torch.nn as nn
class CNNWithGAP(nn.Module):
def __init__(self, num_classes=10):
super(CNNWithGAP, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, 3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(64, 128, 3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(128, 256, 3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
)
# Agrupación promedio global
self.avgpool = nn.AdaptiveAvgPool2d(1)
self.classifier = nn.Linear(256, num_classes)
def forward(self, x):
x = self.features(x)
x = self.avgpool(x)
x = x.view(x.size(0), -1)
x = self.classifier(x)
return x
model = CNNWithGAP()
x = torch.randn(4, 3, 32, 32)
output = model(x)
print("Forma de entrada:", x.shape)
print("Forma de salida:", output.shape)
print("nEl mapa de características se agrupa globalmente en un solo vector")
import torch.nn as nn
class CNNWithGAP(nn.Module):
def __init__(self, num_classes=10):
super(CNNWithGAP, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, 3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(64, 128, 3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(128, 256, 3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
)
# Agrupación promedio global
self.avgpool = nn.AdaptiveAvgPool2d(1)
self.classifier = nn.Linear(256, num_classes)
def forward(self, x):
x = self.features(x)
x = self.avgpool(x)
x = x.view(x.size(0), -1)
x = self.classifier(x)
return x
model = CNNWithGAP()
x = torch.randn(4, 3, 32, 32)
output = model(x)
print("Forma de entrada:", x.shape)
print("Forma de salida:", output.shape)
print("nEl mapa de características se agrupa globalmente en un solo vector")
Ejemplo 4: Comparación con la agrupación normal
Ejemplo
import torch
import torch.nn as nn
# Agrupación adaptativa vs agrupación normal
adaptive = nn.AdaptiveAvgPool2d(2)
regular = nn.AvgPool2d(kernel_size=16, stride=16)
x = torch.randn(1, 64, 32, 32)
out_adaptive = adaptive(x)
out_regular = regular(x)
print("Entrada:", x.shape)
print("Agrupación adaptativa (salida 2x2):", out_adaptive.shape)
print("Agrupación promedio normal (16x16):", out_regular.shape)
import torch.nn as nn
# Agrupación adaptativa vs agrupación normal
adaptive = nn.AdaptiveAvgPool2d(2)
regular = nn.AvgPool2d(kernel_size=16, stride=16)
x = torch.randn(1, 64, 32, 32)
out_adaptive = adaptive(x)
out_regular = regular(x)
print("Entrada:", x.shape)
print("Agrupación adaptativa (salida 2x2):", out_adaptive.shape)
print("Agrupación promedio normal (16x16):", out_regular.shape)
Agrupación adaptativa vs agrupación normal
| Tipo | Ventajas | Escenarios aplicables |
|---|---|---|
| AdaptiveAvgPool | Tamaño de entrada arbitrario | Entradas de diferentes escalas |
| AvgPool | Cálculo más rápido | Tamaño de entrada fijo |
Preguntas frecuentes
P1: ¿Cuándo usar la agrupación adaptativa?
Cuando el tamaño de entrada no es fijo, o se necesita unificar a un tamaño fijo.
P2: ¿Qué es el Global Average Pooling?
AdaptiveAvgPool2d(1), agrupa cada mapa de características en un solo valor.
Escenarios de uso
- Redes de clasificación: La agrupación promedio global reemplaza la capa FC
- Entrada multiescala: Adaptarse a imágenes de diferentes tamaños
- Agregación de características: Extraer información clave
Consejo: La agrupación promedio global puede reducir significativamente la cantidad de parámetros.
Otras extensiones