Guía de transferencia de estilo neuronal

Una guía intuitiva para explorar opciones de diseño y tecnicismos de redes de transferencia de estilo neuronal

Cortesía de Pixabay.com

Introducción

La transferencia de estilo neuronal (NST) es una idea muy clara. NST se basa en la idea clave de que,

es posible separar la representación de estilo y las representaciones de contenido en una CNN, aprendidas durante una tarea de visión de computadora (p. Ej., Tarea de reconocimiento de imagen).

Siguiendo este concepto, NST emplea un pre-entrenado red neuronal de convolución (CNN) para transferir estilos de una imagen determinada a otra. Esto se hace definiendo una función de pérdida que intenta minimizar las diferencias entre una imagen de contenido, una imagen de estilo y una imagen generada, que se analizarán en detalle más adelante. Al final de este tutorial, podrá crear ilustraciones geniales como las de abajo.

Este tutorial cubrirá las siguientes partes en las siguientes secciones del tutorial.

  • Por qué la transferencia de estilo neuronal y la arquitectura de alto nivel [19659009] Cargando VGG 16 pesos como pesos de red pre-entrenados
  • Definiendo entradas, salidas, pérdidas y el optimizador para la red de transferencia de estilo neuronal
  • Definiendo un canal de entrada para alimentar datos a la red
  • Entrenando la red y guardando los resultados
  • Conclusión

Los otros artículos de esta serie se pueden encontrar a continuación.

AB C D * EFGHIJ K L * MNOPQRSTUV W XY Z

* denota artículos detrás del Muro de pagos medio

Objeto de este artículo

El objetivo de este artículo es proporcionar una guía basada en principios. en lugar de un agotamiento del algoritmo, o stifl Ing el lector con largas franjas de código aburrido. Particularmente al final de este artículo, me gustaría que los lectores asimilen los conceptos detrás de NST y sepan por qué ciertas cosas son como son (por ejemplo, la función de pérdida). Como beneficio adicional, los lectores pueden leer el código de extremo a extremo y ver las cosas en acción.

Código

Tenga en cuenta que compartiré solo los fragmentos de código más importantes del artículo. Puede obtener el código completo como un cuaderno Jupyter aquí . El algoritmo se implementa con TensorFlow .

¿Por qué NST?

Las redes neuronales profundas ya han superado el rendimiento a nivel humano en tareas como el reconocimiento y detección de objetos. Sin embargo, las redes profundas se estaban quedando atrás en tareas como la generación de artefactos artísticos que tenían una alta calidad de percepción hasta tiempos recientes. Crear arte de mejor calidad utilizando técnicas de aprendizaje automático es imperativo para alcanzar capacidades similares a las de los humanos, así como abre un nuevo espectro de posibilidades. Y con el avance del hardware informático y la proliferación del aprendizaje profundo, en este momento se está utilizando el aprendizaje profundo para crear arte. Por ejemplo, un arte generado por la IA no se venderá en una subasta por la friolera de $ 432,500.

Arquitectura de alto nivel

Como se indicó anteriormente, la transferencia de estilo neuronal utiliza una red neuronal de convolución pre-entrenada. Luego, para definir una función de pérdida que combina dos imágenes a la perfección para crear arte visualmente atractivo, NST define las siguientes entradas:

  • Una imagen de contenido ( c ) – la imagen a la que queremos transferir un estilo a [19659009] Una imagen de estilo ( s ) – la imagen a la que queremos transferir el estilo desde
  • Una imagen de entrada (generada) ( g ) – la imagen que contiene el resultado final ( la única variable entrenable )

La arquitectura del modelo, así como la forma en que se calcula la pérdida, se muestra a continuación. No es necesario que desarrolle una comprensión profunda de lo que está sucediendo en la imagen a continuación, ya que verá cada componente en detalle en las siguientes secciones. La idea es proporcionar un alto nivel de comprensión del flujo de trabajo que se lleva a cabo durante la transferencia de estilos.

Arquitectura de alto nivel del modelo NST

Descargar y cargar el VGG-16 pre-entrenado

Usted tomará prestado el VGG-16 pesos desde esta página web . Necesitará descargar el archivo vgg16_weights.npz y en una carpeta llamada vgg en el directorio de inicio de su proyecto (lo siento, debí haber automatizado esto, pero era perezoso ). Solo necesitarás la convolución y las capas de agrupación. Específicamente, cargará las primeras 7 capas convolucionales que se utilizarán como la red NST. Puede hacer esto usando la función load_weights (…) que figura en el cuaderno.

Nota : Puede probar más capas. Pero tenga cuidado con las limitaciones de memoria de su CPU y GPU.

https://medium.com/media/be5dccf34f9ce4bb0fc4a8d0d5adcf3b/href

Definiendo funciones para construir la red de transferencia de estilo

Aquí usted define varias funciones que ayudarán más tarde definirá completamente el gráfico computacional de la CNN con una entrada.

Creación de variables TensorFlow

Aquí carga las matrices de números cargados en las variables TensorFlow. Crearemos las siguientes variables:

  • imagen de contenido (tf.placeholder)
  • imagen de estilo (tf.placeholder)
  • imagen generada (tf.Variable and trainable = True)
  • pesos y sesgos pre-entrenados (tf .Variable y entrenable = Falso)

Asegúrese de dejar la imagen generable entrenable mientras mantiene congelados los pesos y sesgos preentrenados. A continuación mostramos dos funciones para definir entradas y pesos de redes neuronales.

https://medium.com/media/a5441a093974872d783609ba2d87cf2f/href

Cálculo de la salida neta VGG

Aquí usted está computando la salida neta VGG por medios de convolución y operaciones conjuntas. Tenga en cuenta que está reemplazando tf.nn.max_pool con la operación tf.nn.avg_pool, ya que tf.nn.avg_pool proporciona mejores resultados visualmente agradables durante la transferencia de estilo [1]. Siéntase libre de experimentar con tf.nn.max_pool cambiando la operación en la siguiente función.

https://medium.com/media/ed1e76a10a777f13090311f559f4726a/href

Funciones de pérdida

En esta sección definimos dos pérdidas funciones; la función pérdida de contenido y la función pérdida de estilo . La función de pérdida de contenido garantiza que las activaciones de las capas superiores sean similares entre la imagen de contenido y la imagen generada. La función de pérdida de estilo asegura que la correlación de activaciones en todas las capas sean similares entre la imagen de estilo y la imagen generada. Discutiremos los detalles a continuación.

Función de costo de contenido

La función de costo de contenido es asegurarse de que el contenido presente en la imagen de contenido se capture en la imagen generada. Se ha encontrado que las CNN capturan información sobre el contenido en los niveles más altos, donde los niveles más bajos se centran más en los valores de píxeles individuales [1]. Por lo tanto, utilizamos la capa CNN más alta para definir la función de pérdida de contenido.

Sea A ^ l_ {ij} (I) la activación de la capa l i th mapa de características y j th posición obtenida utilizando la imagen I . Luego, la pérdida de contenido se define como,

La pérdida de contenido

Esencialmente L_ {content} captura el error cuadrático medio entre las activaciones producidas por la imagen generada y la imagen de contenido. Pero, ¿por qué minimizar la diferencia entre las activaciones de capas superiores garantiza que el contenido de la imagen del contenido se conserve?

Intuición detrás de la pérdida de contenido

Si visualiza lo que aprendió una red neuronal, hay evidencia ] que sugiere que diferentes mapas de características en capas superiores se activan en presencia de diferentes objetos. Entonces, si dos imágenes tienen el mismo contenido, deberían tener activaciones similares en las capas superiores.

Podemos definir el costo del contenido de la siguiente manera.

https://medium.com/media/5e74891ae7866be395c467000013ffa6/href [19659061] Función de pérdida de estilo

Definir la función de pérdida de estilo requiere más trabajo. Para extraer la información de estilo de la red VGG, usamos todas las capas de la CNN. Además, la información de estilo se mide como la cantidad de correlación presente entre los mapas de características en una capa dada. A continuación, una pérdida se define como la diferencia de correlación presente entre los mapas de características calculados por la imagen generada y la imagen de estilo. Matemáticamente, la pérdida de estilo se define como,

w ^ l (uniforme elegido en este tutorial) es un peso otorgado a cada capa durante el cálculo de la pérdida y M ^ l es un hiperparámetro que depende del tamaño de la capa l . Si desea ver el valor exacto, consulte este documento . Sin embargo, en esta implementación, no está utilizando M ^ l ya que será absorbido por otro parámetro al definir la pérdida final.

Intuición detrás de la pérdida de estilo

Aunque el sistema de ecuaciones anterior es un bocado, la idea es relativamente simple. El objetivo es calcular una matriz de estilo (visualizada a continuación) para la imagen generada y la imagen de estilo. Luego, la pérdida de estilo se define como la diferencia cuadrática media entre las dos matrices de estilo.

A continuación puede ver una ilustración de cómo se calcula la matriz de estilo. La matriz de estilo es esencialmente una matriz de Gram, donde el elemento (i, j) th de la matriz de estilo se calcula calculando la multiplicación inteligente de i th y j th mapas de características y suma a lo ancho y alto. En la figura, la cruz roja denota la multiplicación inteligente de los elementos y el signo más rojo denota la suma a lo ancho de los mapas de características.

Puede calcular la pérdida de estilo de la siguiente manera.

https://medium.com/media / d5fe434a6e589a9663a94fcb69c0e9a2 / href

¿Por qué se captura ese estilo en la matriz de Gram?

Es genial que sepamos cómo calcular la pérdida de estilo. Pero aún no se ha demostrado “por qué la pérdida de estilo se calcula utilizando la matriz de Gram”. La matriz de Gram esencialmente captura la “distribución de características” de un conjunto de mapas de características en una capa dada. Al tratar de minimizar la pérdida de estilo entre dos imágenes, esencialmente está emparejando la distribución de características entre las dos imágenes [3, 4].

Nota : Personalmente, no creo que la pregunta anterior haya sido respondida satisfactoriamente. Por ejemplo [4] explica las similitudes entre la pérdida de estilo y la adaptación de dominio . Pero esta relación no responde a la pregunta anterior.

Así que déjame intentar explicar esto un poco más intuitivamente. Digamos que tienes los siguientes mapas de características. Para simplificar, asumo que solo hay tres mapas de características, y dos de ellos están completamente inactivos. Tiene un conjunto de mapas de características en el que el primer mapa de características se ve como un perro, y en el segundo conjunto de mapas de características, el primer mapa de características se ve como un perro boca abajo. Entonces, si intenta calcular manualmente las pérdidas de contenido y estilo, obtendrá estos valores. Esto significa que no hemos perdido información de estilo entre dos conjuntos de mapas de características. Sin embargo, el contenido es bastante diferente.

Comprensión de la pérdida de estilo

Pérdida final

La pérdida final se define como,

donde α y β son ​​usuarios -Perámetros definidos. Aquí β ha absorbido el factor de normalización M ^ l definido anteriormente. Al controlar α y β puede controlar la cantidad de contenido y estilo inyectados a la imagen generada. También puede ver una bonita visualización de diferentes efectos de diferentes valores α y β en el documento .

Definiendo el optimizador

Próximo uso el optimizador de Adam para optimizar la pérdida de la red.

https://medium.com/media/4e6149d81243fbaedf9b6e24329a6e6c/href

Definición del canal de entrada

Aquí se define el canal de entrada completo. tf.data proporciona una interfaz muy fácil de usar e intuitiva para implementar las tuberías de entrada. Para la mayoría de las tareas de manipulación de imágenes, puede utilizar la API tf.image sin embargo, la capacidad de tf.image para manejar imágenes de tamaño dinámico es muy limitada. Por ejemplo, si desea recortar y redimensionar dinámicamente las imágenes, es mejor hacerlo en forma de un generador como se implementa a continuación.

Ha definido dos canales de entrada; Uno para contenido y otro para estilo. El canal de entrada de contenido busca imágenes jpg que comienzan con la palabra contenido_, donde el canal de estilo busca imágenes que comienzan con style_.

https://medium.com/media/0f11df08316f581ba3ace89855d0313c/href

Definición del gráfico computacional [19659004] ¡Ahora estás listo para rockear y rodar! En esta sección, definirá el gráfico computacional completo.

  • Defina iteradores que proporcionan entradas
  • Defina entradas y variables CNN
  • Defina el contenido, el estilo y la pérdida total
  • Defina la operación de optimización

https://medium.com/media/515f1e6b6810389c1eeab8820bfbca2e/href[19659051◆Transferenciadeestilodeejecución

Tiempo para ejecutar el gráfico computacional y generar algunas ilustraciones. Las ilustraciones generadas se guardarán en las carpetas data / gen_0, data / gen_1, …, data / gen_5, etc.

https://medium.com/media/cd8faac9439bb26dd37e1acf2036443b/href

Cuando ejecute el arriba del código, debería estar guardando algo de arte en su disco como se muestra a continuación.

Conclusión

En este tutorial, aprendió acerca de la transferencia de estilo neuronal. La transferencia de estilo neuronal permite combinar dos imágenes (una que contiene contenido y una que contiene estilo) para crear un nuevo arte. Primero repasó por qué necesita una transferencia de estilo neuronal y una descripción general de la arquitectura del método. Luego definió las características específicas de la red de transferencia de estilo neuronal con TensorFlow. Específicamente, definió varias funciones para definir las variables / entradas, calcular la salida de VGG, calcular las pérdidas y realizar la optimización. Luego comprendió las dos pérdidas que nos permiten lograr lo que queremos; La pérdida de contenido y la pérdida de estilo en detalle, y vieron cómo se unen para definir la pérdida final. Finalmente, ejecutó el modelo y vio el arte generado por el modelo.

El código para este tutorial está disponible aquí .

Lecturas adicionales

[1] Un algoritmo neural de estilo artístico

[2] Tutorial de Tensorflow sobre la transferencia de estilo neuronal

[3] Artículo de Quora sobre la transferencia de estilo neuronal [19459072] ] Style Transfer


Light on Math Machine Learning: Guía intuitiva de Neural Style Transfer se publicó originalmente en Hacia la ciencia de datos en Medium, donde las personas continúan la conversación resaltando y respondiendo a esta historia.

Dejá un comentario