De ruido aleatorio a imágenes sintéticas: nuestra experiencia construyendo una GAN desde cero
Cuando recibimos la asignación de desarrollar un proyecto basado en Redes Generativas Antagónicas (GAN) para la asignatura de procesamiento de imágenes y video, inicialmente parecía un ejercicio más dentro del curso. Sin embargo, a medida que profundizamos en el tema, descubrimos que se trataba de uno de los desafíos más interesantes y complejos que habíamos afrontado hasta ese momento.
Las GAN están formadas por dos redes neuronales que compiten constantemente entre sí. Por un lado, existe un generador encargado de crear imágenes artificiales a partir de datos aleatorios. Por otro, un discriminador cuya función consiste en distinguir si una imagen proviene de un conjunto real o si fue creada por el generador. Aunque la idea parece sencilla en teoría, implementarla desde cero revela numerosos desafíos relacionados con estabilidad, convergencia y calidad de los resultados.
A lo largo de ocho sesiones de trabajo, dedicamos tiempo a diseñar la arquitectura, corregir errores, realizar pruebas y optimizar distintos componentes del modelo. El resultado final estuvo lejos de ser perfecto, pero el aprendizaje obtenido durante el proceso superó ampliamente nuestras expectativas y nos permitió alcanzar una de las mejores evaluaciones del curso.
La estructura básica de una GAN se apoya en dos elementos fundamentales. El generador recibe un vector de ruido aleatorio como entrada y produce una imagen sintética. El discriminador analiza tanto imágenes reales como generadas e intenta determinar cuáles son auténticas y cuáles han sido creadas artificialmente.
Ambos modelos participan en una especie de juego competitivo. El generador busca engañar al discriminador produciendo imágenes cada vez más convincentes, mientras que el discriminador intenta mejorar continuamente su capacidad para detectar falsificaciones. Esta dinámica de aprendizaje simultáneo es precisamente lo que hace tan potentes a las GAN, aunque también es la principal causa de su inestabilidad durante el entrenamiento.
Para nuestro experimento utilizamos un conjunto relativamente pequeño de aproximadamente 500 imágenes de perros. Muy pronto comprobamos que esta limitación tendría un impacto considerable en los resultados. Este tipo de modelos suele beneficiarse de miles o incluso decenas de miles de ejemplos, por lo que trabajar con una cantidad tan reducida aumentaba el riesgo de sobreajuste y dificultaba la generación de imágenes variadas.
Antes del entrenamiento fue necesario aplicar un proceso de preprocesamiento sobre las imágenes. Todas fueron redimensionadas a una resolución uniforme, convertidas a tensores y normalizadas para facilitar el aprendizaje de la red. Estas transformaciones ayudaron a mantener una distribución de datos más estable durante el entrenamiento.

El generador que desarrollamos siguió una arquitectura relativamente simple basada en capas densamente conectadas. El vector de ruido inicial se expandía progresivamente mediante varias capas ocultas hasta transformarse en una representación equivalente a una imagen completa. Para las capas internas utilizamos funciones de activación ReLU, mientras que la salida final empleaba una función Tanh para ajustarse al rango de valores normalizados de las imágenes.
La elección de estas funciones no fue casual. ReLU favorece una propagación más eficiente de los gradientes durante el aprendizaje, mientras que Tanh permite producir valores coherentes con el formato de entrada utilizado por el conjunto de datos.
El discriminador también se construyó mediante una red neuronal totalmente conectada. Su objetivo era recibir una imagen y devolver una probabilidad que indicara si pertenecía al conjunto real o había sido creada por el generador. Para mejorar la estabilidad del entrenamiento se utilizaron activaciones LeakyReLU, una variante diseñada para evitar que determinadas neuronas dejen de aprender durante el proceso de optimización.
El ciclo de entrenamiento seguía una secuencia repetitiva. Primero se entrenaba al discriminador utilizando imágenes reales y generadas. Después se actualizaba el generador con el objetivo de producir imágenes capaces de engañar al discriminador. Finalmente se supervisaban las pérdidas de ambos modelos para detectar posibles problemas de estabilidad.
Durante las primeras pruebas encontramos uno de los problemas más habituales en este tipo de arquitecturas: el discriminador aprendía demasiado rápido. Como consecuencia, el generador apenas recibía información útil para mejorar sus resultados. Para corregir este desequilibrio ajustamos la frecuencia de actualización de cada red y reducimos la tasa de aprendizaje del discriminador.
Otro inconveniente apareció cuando el generador comenzó a producir imágenes excesivamente similares entre sí. Para aumentar la diversidad de las muestras experimentamos con distintas configuraciones de tamaño de lote, incorporamos pequeñas perturbaciones aleatorias en los datos de entrada y aplicamos técnicas de suavizado de etiquetas.
A pesar de estas mejoras, la escasez de imágenes seguía siendo un obstáculo importante. Muchas de las muestras generadas resultaban borrosas o repetitivas. Esto nos permitió comprender una lección fundamental: incluso una GAN correctamente implementada tiene limitaciones importantes cuando los datos disponibles son insuficientes.
Por este motivo, decidimos considerar el proyecto como una demostración funcional del concepto en lugar de perseguir resultados visuales comparables a los obtenidos por modelos entrenados con grandes volúmenes de información.
La evolución del modelo fue bastante evidente a lo largo de las distintas etapas de entrenamiento. Durante las primeras épocas, las imágenes consistían prácticamente en ruido aleatorio sin ninguna estructura reconocible. Más adelante comenzaron a aparecer formas difusas que sugerían ciertos patrones visuales. Finalmente, las últimas iteraciones mostraban estructuras más organizadas, aunque todavía con un nivel considerable de desenfoque y falta de detalle.

Aun con las limitaciones del conjunto de datos, fue posible observar claramente cómo el modelo iba aprendiendo progresivamente a capturar ciertas características presentes en las imágenes originales.
Entre las conclusiones más importantes que obtuvimos destaca la enorme influencia que tienen la cantidad y la calidad de los datos sobre el rendimiento de una GAN. Los conjuntos pequeños pueden servir para validar conceptos y experimentar, pero rara vez permiten alcanzar resultados visuales de alta calidad.
También comprobamos que el equilibrio entre generador y discriminador es uno de los factores más críticos del entrenamiento. Ajustes aparentemente menores en parámetros como las tasas de aprendizaje, el tamaño de lote o la frecuencia de actualización pueden marcar una diferencia mucho mayor que incrementar la complejidad de la arquitectura.
Además, pequeñas técnicas de estabilización pueden aportar mejoras significativas. Estrategias como el suavizado de etiquetas, la incorporación de ruido controlado o el uso de LeakyReLU ayudaron a mantener un aprendizaje más consistente durante todo el proceso.
Por encima de todo, aprendimos que trabajar con GAN implica una gran dosis de experimentación. La depuración continua, las pruebas repetidas y los ajustes constantes forman parte natural del desarrollo de este tipo de modelos.
Tras numerosas iteraciones y semanas de trabajo, conseguimos construir una canalización funcional capaz de generar imágenes sintéticas a partir de ruido aleatorio. Aunque los resultados visuales distaban de ser perfectos, la experiencia nos permitió comprender en profundidad cómo estas redes aprenden, por qué fracasan en determinadas situaciones y qué estrategias pueden utilizarse para mejorar su rendimiento. Ese conocimiento práctico resultó mucho más valioso que cualquier explicación teórica encontrada en libros o documentación.