Logo de CursoIA
CursoIA Curso de Inteligencia Artificial

Redes convolucionales (CNN), Unidad 3 — Parámetros de la convolución, 3.1 — Stride, padding y tamaño ·

Stride y resolución

Stride y resolución: Implicaciones clave para las redes convolucionales

Introducción

Las redes convolucionales (CNN, por sus siglas en inglés) son fundamentales en el campo de la visión por computadora debido a su capacidad para extraer características de imágenes. Una característica crítica que ayuda a controlar y optimizar el proceso de extracción de características es el stride. El stride se refiere al tamaño del paso que realiza un filtro convolucional al recorrer una imagen, lo cual impacta directamente en la resolución de las mapas de características (feature maps) generados por las capas convolucionales. En esta guía, exploraremos cómo el stride y la resolución interactúan en CNNs, sus implicaciones y cómo controlarlos para mejorar el rendimiento del modelo.

Explicación principal con ejemplos

Concepto básico: Stride

El stride es una medida que determina cuántas posiciones o "pasos" se desplazará un filtro convolucional a lo largo de la imagen. Si definimos el stride como 1, el filtro se moverá una posición en cada iteración; si es 2, saltará dos posiciones. El valor del stride afecta directamente al tamaño de las feature maps generadas y a la resolución de los mapas de características.

Ejemplo práctico

Imaginemos una imagen de entrada con dimensiones \(32 \times 32\) (ancho por alto) y un filtro convolucional de \(5 \times 5\). Si el stride es 1, el número de feature maps generados será:

\[ \text{Nueva resolución} = \frac{\text{Tamaño original} - (\text{Tamaño del filtro} - 1)}{\text{Stride}} + 1 \]

Para nuestro ejemplo:

\[ \text{Resolución nueva} = \frac{32 - (5 - 1)}{1} + 1 = 32 - 4 + 1 = 29 \times 29 \]

Si el stride fuera 2, la resolución sería:

\[ \text{Resolución nueva} = \frac{32 - (5 - 1)}{2} + 1 = 32 - 4 + 1 = 15 \times 15 \]

Bloque de código

import numpy as np

def convolve(image, filter, stride=1):
    height, width = image.shape
    filter_height, filter_width = filter.shape
    
    output_height = (height - filter_height + 1) // stride + 1
    output_width = (width - filter_width + 1) // stride + 1
    
    feature_map = np.zeros((output_height, output_width))
    
    for i in range(output_height):
        for j in range(output_width):
            x_start = i * stride
            y_start = j * stride
            x_end = x_start + filter_height
            y_end = y_start + filter_width
            
            feature_map[i][j] = np.sum(image[x_start:x_end, y_start:y_end] * filter)
    
    return feature_map

# Ejemplo de uso
image = np.random.rand(32, 32) # Genera una imagen de ejemplo
filter = np.ones((5, 5)) / 25  # Filtro convolucional de ejemplo
stride_value = 1
result = convolve(image, filter, stride=stride_value)
print(result.shape)  # Salida: (29, 29) si stride=1

Errores típicos / trampas

1. Confundir stride con padding

A menudo se confunde el padding (relleno) con el stride en términos de tamaño y efecto en la resolución. Mientras que el padding controla cómo se rellenan los bordes de la imagen para evitar pérdida de resolución, el stride determina cuántas posiciones pone entre los elementos del filtro.

2. Ignorar el efecto combinado de stride y padding

Es común olvidarse de considerar la interacción entre padding y stride, lo que puede resultar en una mala resolución final. Por ejemplo, usar padding SAME en TensorFlow con stride=1 da resultados diferentes a usar padding VALID con stride=2.

3. No ajustar el tamaño del filtro adecuadamente

A veces, los desarrolladores olvidan considerar cómo el tamaño del filtro convolucional interactúa con el stride para generar feature maps de la resolución deseada. Un filtro demasiado grande con un stride pequeño puede resultar en pérdida de detalles, mientras que un filtro pequeño con un stride alto puede resultar en una gran pérdida de información.

4. Ignorar las dimensiones del canal

Es posible olvidarse de considerar cómo el stride afecta a los mapas de características en canales multicanal (tensores 3D). Esto puede llevar a problemas en la implementación y optimización del modelo, especialmente cuando se manejan múltiples canales.

5. No evaluar manualmente el impacto

A veces, las simularidades gráficas pueden ser engañosas. Es recomendable realizar cálculos manuales para verificar el tamaño exacto de las feature maps antes y después del stride en diferentes condiciones.

Checklist accionable

  1. Identificar y documentar el tamaño del filtro convolucional.
  2. Determinar el valor óptimo del stride basado en la resolución deseada.
  3. Elegir el método adecuado de padding (SAME o VALID) para mantener la resolución.
  4. Calcular manualmente el nuevo tamaño de las feature maps antes de entrenar el modelo.
  5. Implementar validaciones y verificaciones durante la implementación del stride para evitar errores inesperados.

Cierre

Siguientes pasos

  • Revisar el impacto del stride en modelos preexistentes: Analiza cómo diferentes valores de stride afectan a tu modelo existente.
  • Experimentar con diferentes combinaciones de stride y padding: Prueba diferentes configuraciones para encontrar lo que mejor funciona para tu tarea específica.
  • Optimizar la resolución de las feature maps: Ajusta los parámetros según sea necesario para lograr una representación óptima de las características.

El control sobre el stride es crucial para la eficiencia y efectividad de las redes convolucionales. Al comprender cómo impacta en la resolución de las feature maps, puedes diseñar modelos más precisos y eficientes.

Contacto

Indica tu objetivo (ChatGPT, RAG, agentes, automatización) y tu stack (web/backend).