Path: blob/master/site/es-419/tutorials/generative/deepdream.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
DeepDream
En este tutorial encontrará una implementación mínima de DeepDream, como se describe en esta entrada de blog de Alexander Mordvintsev.
DeepDream es un experimento que visualiza los patrones aprendidos por la red neuronal. De forma similar a la que un niño mira las nubes e intenta interpretar formas aleatorias, DeepDream sobreinterpreta y mejora los patrones en una imagen.
Para hacer esto, DeepDream envía una imagen a través de la red, luego calcula el gradiente de la imagen en relación con las activaciones de una capa en particular. Entonces se modifica la imagen para aumentar las activaciones y se mejoran los patrones que ve la red, lo que da como resultado una imagen onírica. Este proceso se denomina "inceptionism" (una referencia a InceptionNet y a la película El origen).
Veamos cómo puede hacer que una red neuronal "sueñe" y mejore los patrones surreales que ve en una imagen.
Elegir una imagen para hacerla onírica
Para este tutorial, usemos una imagen de un labrador.
Preparar el modelo de extracción de características
Descargue y prepare un modelo de clasificación de imágenes preentrenado. Usará InceptionV3 que es similar al modelo usado originalmente en DeepDream. Tenga en cuenta que cualquier modelo preentrenado funcionará, aunque, si lo cambia, deberá ajustar los nombres de la capa a continuación.
La idea en DeepDream es elegir una capa (o capas) y maximizar la "pérdida" de manera que la imagen "avive" las capas progresivamente. La complejidad de las características incorporadas depende de las capas que usted elija, por ejemplo, las capas inferiores producen trazos y patrones simples, mientras que las capas más profundas les dan características más sofisticadas a las imágenes o incluso objetos enteros.
La arquitectura de InceptionV3 es bastante grande (para ver un gráfico de la arquitectura del modelo visite el repositorio de investigación) de TensorFlow. Para DeepDream, las capas de interés son aquellas donde las convoluciones están concatenadas. En InceptionV3 hay 11 de estas capas, llamadas "mixed0" hasta "mixed10". El uso de diferentes capas dará resultados de diferentes imágenes oníricas. Las capas más profundas responden a características de nivel más alto (como ojos y caras), mientras que las primeras capas responden a características más simples (como bordes, formas y texturas). Puede experimentar libremente con las capas que seleccione a continuación, pero tenga en cuenta que llevará más tiempo entrenar las capas más profundas (aquellas con un mayor índice) ya que la computación de gradientes es más profunda.
Calcular la pérdida
La pérdida es la suma de las activaciones en las capas seleccionadas. La pérdida se normaliza en cada capa para que la contribución de las capas más grandes no supere el peso de las capas más pequeñas. Normalmente, la pérdida es una cantidad que se quiere minimizar con el descenso del gradiente. En DeepDream, maximizará esta pérdida mediante el ascenso del gradiente.
Ascenso de gradiente
Una vez calculada la pérdida para las capas seleccionadas, lo único que queda es calcular los gradientes con respecto a la imagen y agregarlas a la imagen original.
Al agregar los gradientes en la imagen, se mejoran los patrones que ve la red. En cada paso, creará una imagen que avive progresivamente las activaciones de ciertas capas en la red.
El método que hace esto, a continuación, estará encapsulado en un tf.function
para mejorar el rendimiento. Use un input_signature
para que no se vuelva a recorrer la función para distintos tamaños de imágenes o valores depasos
/step_size
. Vea la Guía de funciones concretas para obtener más detalles.
Bucle principal
Subir una octava
Todo muy lindo pero hay algunos problemas con el primer intento:
La salida tiene ruido (esto puede tratarse con una pérdida
tf.image.total_variation
).La imagen es de baja resolución.
Parece como si los patrones ocurrieran en la misma granularidad.
Nuestro enfoque para encargarse de todos estos problemas es aplicar un ascenso de gradiente a diferentes escalas. Esto permitirá que los patrones se generen a escalas más pequeñas para que sean incorporados en patrones de escalas más altas y que se completen con detalles adicionales.
Para hacer esto, puede ejecutar el enfoque previo de ascenso de gradiente, luego puede aumentar el tamaño de la imagen (conocido como una octava) y repetir el proceso para múltiples octavas.
Opcional: Aumentar la escala con mosaicos
Se debe considerar que a medida que aumenta el tamaño de la imagen, también aumentará el tiempo y la memoria que se necesitan para realizar el cálculo del gradiente. La implementación de la octava anterior no funcionará en imágenes muy grandes o en muchas octavas.
Para evitar este problema puede dividir la imagen en mosaicos y calcular el gradiente de cada mosaico.
Al aplicar desplazamientos aleatorios en la imagen antes de cada cálculo de mosaico se evita que aparezcan uniones de mosaicos.
Para empezar, implemente el desplazamiento aleatorio:
Aquí hay un equivalente en mosaico de la función deepdream
definida anteriormente:
Al ponerlo todo junto, le da una implementación de DeepDream escalable que tiene en cuenta la octava:
¡Mucho mejor! Pruebe con distintas cantidades de octavas, escala de octavas y capas activadas para cambiar como luce la imagen creada con DeepDream.
Quizás también le interese TensorFlow Lucid que expande las ideas presentadas en este tutorial para visualizar e interpretar redes neuronales.