He visto algunas preguntas en este sitio sobre Deep Dream, sin embargo, ninguna de ellas parece hablar realmente de lo que está haciendo DeepDream, específicamente. Por lo que he deducido, parecen haber cambiado la función objetivo, y también han cambiado la propagación hacia atrás para que, en lugar de actualizar los pesos, actualicen la imagen de entrada.
Me pregunto si alguien sabe exactamente qué hizo Google. Mencionan en uno de sus artículos la imposición de antecedentes bayesianos cuando llevan a cabo su optimización, y con esto puedo imaginar que lograr que la red neuronal escupe una imagen para cada etiqueta no es tan difícil: simplemente podemos configurar la etiqueta, y luego optimizar el vector de entrada en consecuencia.
Sin embargo, la parte interesante del sueño profundo es que hace esto por capa, y en este sentido no estoy muy seguro de cómo enfatiza los detalles de una manera por capa.
Ciertamente, alimentar una imagen le dará valores en cada neurona, pero ¿cómo podemos usar esa información para exagerar los detalles en la imagen original? He tenido problemas para encontrar informes detallados sobre esto.
Referencias: Aquí vzn respondió una pregunta similar: /cs//a/44857/49671
Desde ese enlace, hay una implementación de Deepdream, aquí: http://auduno.com/post/125362849838/visualizing-googlenet-classes
Excepto que no ofrece una exageración de las características como se discute aquí: http://googleresearch.blogspot.com/2015/06/inceptionism-going-deeper-into-neural.html
Donde ambos muestran la visualización de clases particulares y capas particulares, y dicen:
En lugar de prescribir exactamente qué función queremos que amplifique la red, también podemos dejar que la red tome esa decisión. En este caso, simplemente alimentamos a la red con una imagen o foto arbitraria y dejamos que la red analice la imagen. Luego elegimos una capa y le pedimos a la red que mejore lo que detectó.
Respuestas:
La idea de DeepDream es esta: elija alguna capa de la red (generalmente una capa convolucional), pase la imagen de inicio a través de la red para extraer características en la capa elegida, configure el gradiente en esa capa igual a las activaciones en sí, y luego vuelva a propagar a la imagen
¿Por qué tiene sentido? Intuitivamente, amplifica las características que se activan al máximo en la red. Al volver a propagar este gradiente, realizaremos una actualización de la imagen que aumentará cualquiera de las activaciones existentes. Si hay un detector similar a un gato en la capa y la imagen contiene un parche que se parece un poco a un gato, DeepDream aumenta esta activación al actualizar este parche para que sea aún más parecido a un gato. Como resultado, DeepDream está tratando de encontrar gatos y perros en todas partes de la imagen (el conjunto de datos de ImageNet tiene muchos perros, por lo que la red tiene muchas neuronas relacionadas con los perros).
objective_L2
fuente