Función PyTorch torch.nn.AdaptiveAvgPool2d

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

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)

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")

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)

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.


PyTorch torch.nn 参考手册Manual de referencia de PyTorch torch.nn

Otras extensiones