Path: blob/master/site/es-419/tutorials/generative/cvae.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
Autocodificador variacional convolucional
En este cuaderno se enseña cómo entrenar un autocodificador variacional (VAE por sus siglas en inglés) (1, 2) en el conjunto de datos MNIST. Un VAE es un enfoque probabilístico del autocodificador, es un modelo que toma datos de entrada de alta dimensión y los comprime en una representación más pequeña. A diferencia de un autocodificador tradicional, que mapea la entrada en un vector latente, un VAE mapea los datos de entrada en parámetros de distribución de probabilidad, tales como la media y la varianza de una gaussiana. Este enfoque produce un espacio de latente continuo y estructurado, que sirve para generar una imagen.
Preparación
Cargar el conjunto de datos MNIST
Cada imagen de MNIST es originalmente un vector de 784 enteros, cada uno de entre 0 y 255 y representan la intensidad de un pixel. Modele cada pixel con la distribución de Bernoulli en nuestro modelo y convierta el conjunto de datos en binario de forma estática.
Usar tf.data para poner los datos en lotes y en orden aleatorio
Definir las redes del codificador y del decodificador con tf.keras.Sequential
En este ejemplo de VAE, use dos ConvNets pequeños para las redes del codificador y del decodificador. En la documentación, también se las conoce como inferencia/reconocimiento y modelos generativos respectivamente. Use tf.keras.Sequential
para simplificar la implementación. Dejemos que y denoten la observación y la variable de latente respectivamente en las siguientes descripciones.
Red del codificador
Define la distribución posterior aproximada de , que toma como entrada una observación y tiene como salida un conjunto de parámetros para especificar la distribución condicional de la representación latente . En este ejemplo, simplemente modele la distribución como una gaussiana diagonal y la salida de la red será los parámetros de la media y de la varianza logarítmica de una gaussiana factorizada. Tiene como salida directamente el logaritmo de la varianza logarítmica en vez de la varianza para conservar la estabilidad numérica.
Red del decodificador
Define la distribución condicional de la observación , que toma una muestra de latente como entrada y tiene como salida los parámetros para una distribución condicional de la observación. Modele la distribución latente antes de como una gaussiana de unidad.
Engaño de reparametrización
Para generar una muestra para el decodificador durante el entrenamiento, puede tomar una muestra de la distribución latente definida por los parámetros que salieron del codificador, al recibir una observación de entrada . Sin embargo, esta operación de muestra crea un cuello de botella porque la retropropagación no puede fluir a través de un nodo aleatorio.
Para arreglar esto, use un engaño de reparametrización. En nuestro ejemplo, usted aproximará mediante el uso de los parámetros del decodificador y otro parámetro de la siguiente manera:
donde y representan la desviación media y estándar de una distribución gaussiana respectivamente. Pueden derivarse de la salida del decodificador. El puede ser considerado como un ruido aleatorio para conservar la estocasticidad de . Genere a partir de una distribución normal estándar.
La variable latente ahora se genera mediante la función de , y , que permitirá que el modelo retropropague gradientes en el codificador a través de y respectivamente, mientras conserva la estocasticidad a través de .
La arquitectura de la red
Para la red del codificador, use dos capas convolucionales seguidas de una capa completamente conectada. En la red del decodificador, replique esta arquitectura usando una capa completamente conectada seguida de tres capas de convolución transpuesta (también conocidas como capas deconvolucionales en algunos contextos). Nota, es común evitar el uso de normalización de lotes cuando se entrenan las VAE, ya que la estocasticidad adicional causada por el uso de mini lotes puede agravar la inestabilidad además de la estocasticidad de las muestras.
Definir la función de pérdida y el optimizador
Las VAE entrenan al maximizar el límite inferior de evidencia (ELBO, por sus siglas en inglés) en la probabilidad logarítmica marginal:
En la práctica, optimice el cálculo estimado de Monte Carlo de la muestra única del siguiente valor esperado:
Nota: También puede calcular analíticamente el término KL, pero en este caso puede incorporar los tres términos en el estimador de Monte Carlo para que sea más simple.
Entrenamiento
Primero, iteramos el conjunto de datos
Durante cada iteración, pase la imagen al codificador para obtener un conjunto de parámetros de la media y de la varianza de logaritmos de la posterior aproximada
luego aplique el engaño de reparametrización para tomar una muestra de
Por último, pase las muestras reparametrizadas al decodificador para obtener los logit de la distribución generativa
Nota: Ya que se usó el conjunto de datos cargado mediante Keras con 60k puntos de datos en el conjunto de entrenamiento y 10k puntos de datos en el conjunto de prueba, nuestro ELBO resultante en el conjunto de prueba es un poco más alto que los resultados registrados en la documentación que usa una binarización dinámica de la MNIST de Larochelle.
Generar imágenes
Después del entrenamiento, es hora de generar algunas imágenes
Para empezar, tome una muestra del conjunto de vectores latentes de la gaussiana de unidad antes de la distribución
Luego de esto, el generador convertirá la muestra latente en logits de observación, lo que resultará en una distribución
Aquí, puede trazar las probabilidades de las distribuciones de Bernoulli
Mostrar una imagen generada en la última época del entrenamiento
Mostrar un GIF animado de todas las imágenes guardadas
Mostrar una variedad bidimensional de cifras del espacio latente
Al ejecutar el siguiente código, se mostrará una distribución continua de diferentes clases de cifras, con cada cifra transformándose en otra en todo el espacio latente bidimensional. Use TensorFlow Probability para generar una distribución estándar normal para el espacio latente.
Próximos pasos
En este tutorial, se explicó cómo implementar un autocodificador variacional convolucional con TensorFlow.
Su próximo paso puede ser intentar mejorar la salida del modelo al aumentar el tamaño de la red. Por ejemplo, puede intentar configurar los parámetros de filter
para cada una de las capas Conv2D
y Conv2DTranspose
a 512. Tenga en cuenta que, para generar el trazado bidimensional de la imagen latente, deberá conservar latent_dim
en 2. Además, el tiempo de entrenamiento se reducirá a medida que aumente el tamaño de la red.
También puede intentar implementar una VAE con un conjunto de datos diferente, como el CIFAR-10.
Las VAE pueden implementarse con diferentes estilos y diversas complejidades. Puede encontrar más implementaciones en los siguientes recursos:
Si le gustaría obtener más información sobre los detalles de las VAE, vea Una introducción a los autocodificadores variacionales.