Google DeepDream Elaborated

12

J'ai vu quelques questions sur ce site à propos de Deep Dream, mais aucune d'entre elles ne semble réellement parler de ce que fait DeepDream, en particulier. Pour autant que je sache, ils semblent avoir changé la fonction objectif et également changé la rétropropagation de sorte qu'au lieu de mettre à jour les poids, ils mettent à jour l'image d'entrée.

Je me demande si quelqu'un sait exactement ce que Google a fait. Ils mentionnent dans l'un de leurs articles d'imposer des prieurs bayésiens lorsqu'ils effectuent leur optimisation, et avec cela, je peux imaginer que faire en sorte que le réseau neuronal crache une image pour chaque étiquette n'est pas si difficile - nous pouvons simplement définir l'étiquette, puis optimiser le vecteur d'entrée en conséquence.

Cependant, la partie intéressante de Deep Dream est qu'il fait cela par couche, et à cet égard, je ne sais pas trop comment il met l'accent sur les détails d'une manière par couche.

Certes, l'alimentation d'une image vous donnera des valeurs à chaque neurone, mais comment pouvons-nous utiliser ces informations pour exagérer les détails de l'image d'origine? J'ai eu du mal à trouver des articles détaillés à ce sujet.

Références: Ici vzn a répondu à une question similaire: /cs//a/44857/49671

À partir de ce lien, il y a une implémentation de Deepdream, ici: http://auduno.com/post/125362849838/visualizing-googlenet-classes

Sauf qu'il n'offre pas d'exagération des fonctionnalités comme discuté ici: http://googleresearch.blogspot.com/2015/06/inceptionism-going-deeper-into-neural.html

Où ils montrent tous deux la visualisation de classes particulières et de couches particulières, et disent:

Au lieu de prescrire exactement quelle fonctionnalité nous voulons que le réseau amplifie, nous pouvons également laisser le réseau prendre cette décision. Dans ce cas, nous alimentons simplement le réseau avec une image ou une photo arbitraire et nous laissons le réseau analyser l'image. Nous choisissons ensuite une couche et demandons au réseau d'améliorer tout ce qu'il a détecté.

Bob
la source
2
Duplication possible de Deep Dreamer
manlio

Réponses:

7

L'idée de DeepDream est la suivante: choisissez une couche du réseau (généralement une couche convolutionnelle), passez l'image de départ à travers le réseau pour extraire des entités sur la couche choisie, définissez le gradient sur cette couche égal aux activations elles-mêmes, puis rétropropaglez à l'image.

Pourquoi est-ce logique? Intuitivement, il amplifie les fonctionnalités qui sont activées au maximum dans le réseau. En rétropropagant ce dégradé, nous ferons une mise à jour d'image qui stimulera l'une des activations existantes. S'il y a un détecteur ressemblant à un chat dans la couche et que l'image contient un patch qui ressemble un peu à un chat, DeepDream stimule cette activation en mettant à jour ce patch pour le rendre encore plus semblable à un chat. En conséquence, DeepDream essaie de trouver des chats et des chiens partout dans l'image (l'ensemble de données ImageNet a beaucoup de chiens, donc le réseau a de nombreux neurones liés aux chiens).

Si vous regardez le code , la partie clé est la objective_L2fonction qui fait ceci: puis propage en retour.dx=x

Maxime
la source