es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo hacer un lote con imágenes de diferentes tamaños para un modelo en PyTorch?

Quiero usar GlobalAveragePooling en mi modelo de PyTorch y no modificar el tamaño, recortar ni rellenar la imagen. Puedo entrenar mi modelo usando solo una imagen en cada iteración (no en lotes). Pero es demasiado lento y no sé cómo usar varias imágenes de diferentes tamaños como entrada para el modelo.
Ejemplo de código del modelo:

class GAPModel(nn.Module):
  def __init__(self):
    super().__init__()

    self.conv = nn.Sequential(
        nn.Conv2d(3, 16, kernel_size=3),
        nn.ReLU(inplace=True),
    )

    self.linear = nn.Sequential(
        nn.Linear(in_features=16, out_features=1),
        nn.ReLU(),
    )

  def forward(self, image):
      return self.linear(self.conv(image).mean([2, 3]))
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para utilizar GlobalAveragePooling en el modelo PyTorch sin cambiar el tamaño, recortar o rellenar la imagen, podemos usar la función AdaptiveAvgPool2d. Es posible utilizar varias imágenes de diferentes tamaños como entrada para el modelo, redimensionándolas a un tamaño común antes de pasarlas por el modelo.

    Código de ejemplo:

    import torch.nn.functional as F
    
    class GAPModel(nn.Module):
      def __init__(self):
        super().__init__()
    
        self.conv = nn.Sequential(
            nn.Conv2d(3, 16, kernel_size=3),
            nn.ReLU(inplace=True),
        )
    
        self.linear = nn.Sequential(
            nn.Linear(in_features=16, out_features=1),
            nn.ReLU(),
        )
    
      def forward(self, images):
        resized_images = []
        for image in images:
            resized_image = F.adaptive_avg_pool2d(image, output_size=(height, width))
            resized_images.append(resized_image)
        resized_images = torch.stack(resized_images)
        return self.linear(self.conv(resized_images).mean([2, 3]))
    

    Este código redimensiona cada imagen de entrada a un alto y ancho especificados utilizando adaptive average pooling, las apila juntas en un lote y luego pasa el lote a través de las capas convolucionales y lineales para producir el conjunto de salidas.

Comments are closed.