Path: blob/master/site/es-419/tutorials/generative/dcgan.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
Redes generativas adversarias convolucionales profundas
En este tutorial se enseña como generar imágenes de cifras escritas a mano con la red generativa adversaria convolucional profunda (DCGAN, por sus siglas en inglés). El código se escribe con la API secuencial de Keras con un bucle de entrenamiento tf.GradientTape
.
¿Qué son las redes GAN?
Actualmente, las redes generativas adversarias (GAN, por sus siglas en inglés) son una de las ideas más interesantes en ciencias de la computación. Se entrenan dos modelos en simultáneo mediante un proceso adversario. Un generador ("el artista") aprende a crear imágenes que parecen reales, mientras que un discriminador ("el crítico de arte") aprende a diferenciar entre las imágenes reales y las falsas.
Durante el entrenamiento, el generador es cada vez más bueno en crear imágenes que parecen reales, mientras que el discriminador es cada vez más bueno en notar la diferencia. El proceso encuentra un equilibrio cuando el discriminador ya no puede diferenciar entre las imágenes reales y las falsas.
En este cuaderno, se explica este proceso en un conjunto de datos MNIST. La siguiente animación muestra una serie de imágenes producidas por el generador durante un entrenamiento para 50 épocas. Al principio, las imágenes son ruido aleatorio y, con el tiempo, comienzan a lucir más como cifras escritas a mano.
Para más información sobre las redes GAN, vea el curso de introducción de aprendizaje profundo de MIT.
Preparación
Cargar y preparar el conjunto de datos
Usará el conjunto de datos para entrenar el generador y el discriminador. El generador generará cifras escritas a mano que se parezcan a los datos de MNIST.
Crear los modelos
El generador y el discriminador se definen mediante el uso de la API secuencial de Keras.
El generador
El generador usa las capas tf.keras.layers.Conv2DTranspose
(aumento de la resolución) para producir una imagen a partir de un valor de inicialización (ruido aleatorio). Comience con una capa Dense
que tome este valor de inicialización como entrada, luego aumente la resolución varias veces hasta alcanzar el tamaño de imagen deseado de 28x28x1. Note la activación de tf.keras.layers.LeakyReLU
para cada capa, excepto en la capa externa que usa tanh.
Use el generador (sin entrenamiento aún) para crear una imagen.
El discriminador
El discriminador es un clasificador de imágenes basadas en la red neuronal convolucional (CNN, por sus siglas en inglés).
Use el discriminador (sin entrenar aún) para clasificar las imágenes generadas en reales o falsas. El modelo será entrenado para que tenga como salida valores positivos para las imágenes reales y valores negativos para las imágenes falsas.
Definir la pérdida y los optimizadores
Defina las funciones de pérdida y los optimizadores para ambos modelos.
Pérdida del discriminador
Este método cuantifica qué tan bueno es el discriminador para distinguir entre imágenes reales y falsas. Compara las predicciones del discriminador sobre las imágenes reales en un arreglo de números 1 y las predicciones del discriminador sobre las imágenes falsas (generadas) en un arreglo de números 0.
Pérdida del generador
La pérdida del generador cuantifica qué tan bueno es para engañar al discriminador. De forma intuitiva, si el generador funciona bien, el discriminador clasificará a las imágenes reales en falsas (o con el número 1). Ahora, compare las decisiones del discriminador sobre las imágenes generadas en un arreglo de números 1.
Los optimizadores del discriminador y del generador son diferentes ya que se entrenarán dos redes por separado.
Guardar puntos de verificación
En este cuaderno también se enseñará cómo guardar y recuperar modelos, lo cual es útil en caso de que se interrumpa una tarea de ejecución larga.
Definir el bucle de entrenamiento
El bucle de entrenamiento comienza cuando el generador recibe un valor de inicialización aleatorio como entrada. Ese valor se usa para producir una imagen. Luego, se usa el discriminador para clasificar imágenes reales (extraídas del conjunto de datos de entrenamiento) e imágenes falsas (producidas por el generador). Se calcula la pérdida para cada uno de estos modelos y se usan los gradientes para actualizar el generador y el discriminador.
Generar y guardar imágenes
Entrenar el modelo
Llame al método train()
que se definió anteriormente para entrenar el generador y el discriminador de forma simultánea. Nota: entrenar las redes GAN puede ser complicado. Es importante que el generador y el discriminador no se superpongan (por ejemplo, que sean entrenados al mismo ritmo).
Al principio del entrenamiento, las imágenes generadas lucirán como ruido aleatorio. A medida que el entrenamiento avanza, las cifras generadas se verán cada vez más reales. Luego de 50 épocas, se verán como las cifras del MNIST. Esto puede tardar un minuto/época con la configuración predeterminada en Colab.
Restaurar el último punto de verificación
Crear un GIF
Use imageio
para crear un gif animado para usar imágenes que se guardaron durante el entrenamiento.
Próximos pasos
En este tutorial se mostró el código completo necesario para escribir y entrenar una red GAN. El siguiente paso que tome puede ser experimentar con diferentes conjuntos de datos, por ejemplo, el conjunto de datos de atributos de las caras de celebridades a gran escala (CelebA) disponible en Kaggle. Para más información sobre las redes GAN, vea el Tutorial de NIPS 2016: Redes generativas adversarias.