Entradas

Introducción al autoencoder

Autor:Nathan Hubens

Linkedind: https://www.linkedin.com/in/nathan-hubens

Tradutor: Paula Vidal

 

 

Los autoencoders son redes neuronales con el objetivo de generar nuevos datos primero comprimiendo la entrada en un espacio de variables latentes y luego reconstruyendo la salida en base a la información adquirida. Este tipo de red consta de dos partes:

  1. Encoder: la parte de la red que comprime la entrada en un espacio de variables latentes y que puede representarse mediante la función de codificación h = f (x).
  2. Decoder: la parte que trata de reconstruir la entrada en base a la información recolectada previamente. Se representa mediante la función de decodificación r = g (h).

1 3

Arquitectura de un autoencoder.

 

El autoencoder se puede describir con la siguiente función d (f (x)) = r  donde r es similar a la entrada original de x.

¿Por qué copiar la entrada en la salida?

Lo que esperamos es que, cuando entrenamos un autoencoder y copiamos la entrada, el espacio de variables latentes h pueda tomar características útiles para nosotros.

Esto se puede lograr imponiendo límites a la acción de codificación, forzando el espacio h que sea de menores  dimensiones que x. En este caso, el autoencoder viene llamado undercomplete. Al entrenar el espacio undercomplete, traemos el autoencoder que capturar las características más relevantes de los datos de entrenamiento. Si no les damos suficientes restricciones, la red se limita a la tarea de copiar la entrada en la salida, sin individuar ninguna información útil sobre la distribución de datos. Esto puede suceder incluso cuando el tamaño del subespacio latente tiene el mismo tamaño que el espacio inicial; en el caso cuando tenemos un caso de autoencoder overcomplete, significa que  el tamaño del espacio de variables latentes es mayor que las entradas. En estos casos, incluso con  simples encoder y decoder lineales, podemos copiar la entrada en la salida sin aprender nada sobre los datos.

Idealmente, es posible entrenar con éxito cualquier arquitectura basada en el autoencoder eligiendo adecuadamente los parámetros y la capacidad de cada encoder-decoder en función de la complejidad de los datos a modelar.

 

El uso de los autoencoder

Hasta la fecha, la reducción de ruido y la reducción de dimensionalidad para la visualización de datos se consideran las aplicaciones más interesantes de autoencoders. Con el ajuste apropiado de

 

Con la configuración apropiada de la dimensionalidad y las restricciones relacionadas en la dispersión de los datos, a través del autoencoder es posible obtener proyecciones en subespacios de mayor interés en comparación con métodos lineales como PCA.

Los autoencoders se entrenan automáticamente a través de datos de muestra. Esto significa que es fácil entrenar la red para tener un buen rendimiento en tipos similares de entrada, sin la necesidad de generalizar. Es decir, solo la compresión realizada en datos similares a los utilizados en el conjunto de entrenamiento tendrá buenos resultados, pero si se realiza en diferentes datos no será muy efectiva. Otras técnicas de compresión como JPEG serán más capaces de realizar esta función.

 

Estas redes neuronales están capacitadas para conservar la mayor cantidad de información posible cuando se insertan en el encoder y luego en el decoder, pero también para que las nuevas representaciones adquieran diferentes tipos de propiedades. Se describen cuatro tipos de autoencoders , es por esto crearemos un ejemplo para cada uno de ellos utilizandoòps en framework Keras y en el dataset MNIST.

 

Tipos de autoencoder

En este artículo, enumeramos cuatro:

  1. Vanilla autoencoder
  2. Autoencoder multicapa
  3. Autoencoder convolucional
  4. Autoencoder regularizado

Vanila autoencoder

Es la forma más simple, caracterizada por una red de tres capas, es decir, una red neuronal con una sola capa oculta. La entrada y la salida son las mismas y, en nuestro caso, aprendemos cómo reconstruir la entrada mediante el uso del optimizador Adam , como función de pérdida, la desviación mínima del cuadrado.

En esta tipología estamos en el caso de encoder undercomplete donde la capa oculta, con un tamaño igual a 64, es más pequeña que la de la entrada (784), obtenida de la siguiente fórmula 28x28x1. Esta restricción fuerza a la red neuronal a aprender de una representación de datos comprimida.

 

input_size = 784
hidden_size = 64
output_size = 784

x = Input(shape=(input_size,))

# Encoder
h = Dense(hidden_size, activation='relu')(x)

# Decoder
r = Dense(output_size, activation='sigmoid')(h)

autoencoder = Model(input=x, output=r)
autoencoder.compile(optimizer='adam', loss='mse')

 

Autoencoder multicapa

Si solo una capa oculta no es suficiente, podemos extender el autoencoder a lo largo de la dimensión de profundidad. Nuestra implementación ahora usa tres capas ocultas para una mejor generalización, pero también tendremos que hacer que la red sea simétrica utilizando la capa intermedia.

input_size = 784
hidden_size = 128
code_size = 64

x = Input(shape=(input_size,))

# Encoder
hidden_1 = Dense(hidden_size, activation='relu')(x)
h = Dense(code_size, activation='relu')(hidden_1)

# Decoder
hidden_2 = Dense(hidden_size, activation='relu')(h)
r = Dense(input_size, activation='sigmoid')(hidden_2)

autoencoder = Model(input=x, output=r)
autoencoder.compile(optimizer='adam', loss='mse')

Autoencoder convolucional

Surge una pregunta: ¿podrían usarse autoencoders con convoluciones en lugar de capas conectadas por completo?

Y la respuesta es sí. El principio es el mismo, pero se usan vectores tridimensionales en lugar de vectores unidimensionales. La imagen de entrada se muestrea para obtener una representación latente, es decir, una reducción dimensional, lo que obliga al autoencoder a aprender de una versión comprimida de la imagen.

x = Input(shape=(28, 28,1)) 

# Encoder
conv1_1 = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
pool1 = MaxPooling2D((2, 2), padding='same')(conv1_1)
conv1_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool1)
pool2 = MaxPooling2D((2, 2), padding='same')(conv1_2)
conv1_3 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool2)
h = MaxPooling2D((2, 2), padding='same')(conv1_3)


# Decoder
conv2_1 = Conv2D(8, (3, 3), activation='relu', padding='same')(h)
up1 = UpSampling2D((2, 2))(conv2_1)
conv2_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(up1)
up2 = UpSampling2D((2, 2))(conv2_2)
conv2_3 = Conv2D(16, (3, 3), activation='relu')(up2)
up3 = UpSampling2D((2, 2))(conv2_3)
r = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(up3)

autoencoder = Model(input=x, output=r)
autoencoder.compile(optimizer='adam', loss='mse')

Autoencoder regularizado

Existen otros métodos mediante los cuales podemos restringir la reconstrucción del autoencoder como una alternativa a la imposición de una dimensionalidad reducida de las capas ocultas. En lugar de limitar la capacidad del modelo manteniendo una arquitectura poco profunda del encoder y decoder , así como una reducción forzada, los autoencoders regularizados utilizan una función de pérdida para alentar al modelo a asumir propiedades que van más allá de la simple capacidad de copiar la entrada en la salida . En la práctica, encontramos dos tipos diferentes: autoencoder disperso y Denoising autoencoder.

  1. Autoencoder escaso: generalmente se utilizan para la clasificación. Al entrenar un autoencoder, las unidades ocultas en la capa intermedia se activan con demasiada frecuencia. Para evitar esto, debemos reducir su tasa de activación limitándola a una fracción de los datos de entrenamiento. Esta restricción se denomina restricción de dispersión, porque cada unidad se activa solo mediante un tipo de entrada predefinido.
input_size = 784
hidden_size = 64
output_size = 784

x = Input(shape=(input_size,))

# Encoder
h = Dense(hidden_size, activation='relu', activity_regularizer=regularizers.l1(10e-5))(x)

# Decoder
r = Dense(output_size, activation='sigmoid')(h)

autoencoder = Model(input=x, output=r)
autoencoder.compile(optimizer='adam', loss='mse')

Otro cambio que podemos hacer durante la fase de reconstrucción es agregar un término de regularización a nuestra función de pérdida: por ejemplo, un regulador de tipo 1 introduce una penalización en la función de pérdida, que actúa durante la fase de optimización. Como resultado, tendremos menos activaciones que las de un autoencoder de Vanilla

2.Denoising autoencoder:En lugar de agregar penalización a la función de pérdida, podemos hacer que el objeto cambie, agregando ruido a la imagen de entrada y haciendo que el autoencoder aprenda a eliminarlo de manera autónoma. Esto significa que la red extraerá solo la información más relevante y aprenderá de una representación sólida de los datos

x = Input(shape=(28, 28, 1))

# Encoder
conv1_1 = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
pool1 = MaxPooling2D((2, 2), padding='same')(conv1_1)
conv1_2 = Conv2D(32, (3, 3), activation='relu', padding='same')(pool1)
h = MaxPooling2D((2, 2), padding='same')(conv1_2)


# Decoder
conv2_1 = Conv2D(32, (3, 3), activation='relu', padding='same')(h)
up1 = UpSampling2D((2, 2))(conv2_1)
conv2_2 = Conv2D(32, (3, 3), activation='relu', padding='same')(up1)
up2 = UpSampling2D((2, 2))(conv2_2)
r = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(up2)

autoencoder = Model(input=x, output=r)
autoencoder.compile(optimizer='adam', loss='mse')

Utilizar el Deep Learning para mejorar la gráfica de FIFA 18

Autor: Chintan Trivedi

Linkedin: https://www.linkedin.com/in/chintan-trivedi-78665774/

Tradutor: Paula Vidal

 

1

 

Comparación entre las dos caras de Ronaldo: a la izquierda la de FIFA 18, a la derecha la generada por una  red neuronal profunda.

Game Studios ha gastado millones de dólares y cientos de horas de investigación y desarrollo en el diseño de los gráficos del juego, en un intento de hacerlo lo más veraz y natural posible. Aunque las caras de los jugadores son decididamente realistas, aún es posible distinguirlas de las reales. Sin embargo, ¿ han aprovechado los desarrollos  obtenidos en el procesamiento de imágenes utilizando redes neuronales profundas para mejorar los gráficos y, al mismo tiempo, reducir el esfuerzo requerido para hacerlo?

Entonces trataremos de responder usando FIFA 18

Para comprender si los desarrollos recientes pueden ayudarnos a responder esta pregunta,nos concentraremos en mejorar los gráficos faciales de los jugadores que utilizan el algoritmo DeepFakes,  es una red neuronal profunda que puede entrenarse para aprender y generar rostros humanos de una manera extremadamente realista. Este artículo se encargará, por lo tanto, de recrear las caras de los jugadores, sacándolos del juego y luego mejorarlos para que sean idénticos a los reales.

 Nota: aquí encontrará una buena explicación sobre cómo funciona el algoritmo DeepFake, este puede reemplazar una cara con la de cualquier otra persona que use autoencoder y redes neuronales convolucionales.

Recopilar datos de entrenamiento

A diferencia de los desarrolladores del juego, podemos obtener los datos que necesitamos simplemente búscando en Google, sin tener que molestar a Ronaldo y perdile que use los trajes que para registrar sus movimientos.

Comencemos obsenvando su cara digital, una de las mejores obtenidas del juego. Para que recopile  información el algoritmo deepfakes, simplemente necesitamos grabar la cara del jugador a través de la función  instant replay del juego. Ahora podemos reemplazarlo con la verdadera cara de Ronaldo y, para este propósito, descargamos algunas de sus imágenes de la búsqueda de Google que lo muestran desde diferentes ángulos. Estos pocos elementos son todo lo que necesitamos para comenzar el proceso de capacitacion del modelo.

Arquitectura modelo y entrenamiento

El algoritmo deepfakes se refiere al entrenamiento de redes neuronales profundas llamadas autoencoder. Estas redes para el entrenamiento no supervisado se componen de un encoder que comprime la entrada en un espacio de variables latentes denominado “encoding”, y un decoder que utiliza este espacio para reconstruir la entrada. Esta arquitectura obliga a la red a extrapolar información sobre la distribución de los datos de entrada, en lugar de dejar que se limite a la simple tarea de copiar la entrada en la salida. Utilizaremos aquí una red convolucional como un encoder y una red neuronal desconvolucional como decoder. Esta arquitectura está entrenada para minimizar el error de reconstrucción en el aprendizaje no supervisado

En nuestro caso, también formaremos simultáneamente dos autoencoders: el primero aprenderá a recrear la cara de Ronaldo a partir de los gráficos de FIFA 18, mientras que el segundo lo hará utilizando las imágenes reales previamente descargadas. En deepfakes, ambas redes comparten el mismo codificador pero están capacitadas con diferentes decoder.

2.jpg 5

2.jpg 5

  1. Operación del primer autoencoder que aprende de los gráficos del juego

3 2

2. Operación del segundo autoencoder que aprende a través de imágenes reales

Usando un modelo previamente entrenado en otras caras, la pérdida total va de 0.06 a 0.02, aproximadamente, en cuatro horas de entrenamiento usando una GTX 1070. En este caso, la capacitación continuó en el mismo modelo, CageNet, utilizado previamente para generar la cara de Nicolas Cage

Usar el modelo entrenado para intercambiar caras

 

Ahora llegamos a la parte más interesante. El algoritmo puede intercambiar rostros mediante la adopción de un truco inteligente: en el segundo autoencoder se inserta la entrada del primero . De esta forma, el encoder compartido puede usar el encoding obtenido de las caras digitales de FIFA 18 y permitir que el decoder B reconstruya, sobre la base de la imagen digital, la cara real. Al hacerlo, las caras de la FIFA se convierten directamente en la imagen realista de Ronaldo

4 2

El segundo codificador convierte la cara de FIFA en la real de Ronaldo

Resultados

El GIF muestra una vista previa rápida de los resultados obtenidos al permitir que el algoritmo funcione en las caras de otros jugadores. Podemos ver un mejoramiento notable.

 

5 1

5 1

6

6

Comparación antes y después del uso de deepfakes, de las caras de Ronaldo, Morate y Ozil

Se pueden encontrar más resultados en este video.

¿Podemos usar el algoritmo para colocarnos a nosotros mismos en el juego?

La respuesta es sí: todo lo que necesita es un video de un minuto de nosotros mismos y la descarga. El modelo se capacitó en unas pocas horas. Podemos, de esta manera, encontrarnos en el juego en la modalidad  “Viaje”.

Puntos de fuerza y debilidades

La mejor ventaja que hemos obtenido de este enfoque es sin duda el hiperrealismo de los rostros y los gráficos, difícilmente distinguibles de la realidad. Este resultado se puede lograr en unas pocas horas de entrenamiento, a diferencia de lo que ocurre con los desarrolladores del juego que, con el enfoque de hoy, toman años en hacer su trabajo. Esto significa que los productores podrían potencialmente hacer nuevos títulos en plazos mucho más cortos y que las compañías de producción podrían ahorrar una gran cantidad de dinero.

La limitación más obvia hasta ahora es que estas caras se han generado despues, como CGI (imágenes generadas por computadora) en películas, mientras que el juego requiere una realización en tiempo real. No obstante, una gran diferencia es que este enfoque no requiere intervención humana para generar resultados efectivos después de que el modelo ha sido entrenado. Además, la unica limitacion es el tiempo que toma la red neuronal para generar la imagen de salida. Probablemente no tome mucho tiempo para poder tener modelos generativos que no sean demasiado profundos y pesados, que puedan funcionar muy rápidamente sin comprometer la calidad de la producción. Al igual que ocurre con YOLO, SSD y MobileNets para la detección de objetos en tiempo real, lo que antes no era posible con modelos como RCNN.