[PYTHON] L'histoire de la création d'un générateur d'icônes mel

introduction

Connaissez-vous cette icône?

Oui, c'est l'icône du célèbre Melville . On sait qu'il y a beaucoup de gens qui demandent à Melville de dessiner leurs personnages préférés et de les utiliser comme twitter samune, et ont gagné un grand soutien. L'icône dessinée par cette personne est souvent appelée "Mel Icon" en raison de son style unique. Exemple d'icône mel typique

(Respectivement de Yukatayu et Shun (Au 19 février 2020))

Je veux aussi une icône comme celle-ci! !! !! !! !! !! J'ai donc créé un générateur d'icônes mel par machine learning. Dans cet article, je voudrais présenter brièvement la méthode utilisée pour cela.

Qu'est-ce que le GAN

Pour la génération, nous utilisons une méthode appelée GAN (Generative contradictarial networks).

is20tech001zu004-1.jpg Citation du chiffre Original

Cette technique combine deux choses: un réseau neuronal (Generator) qui génère des images et un réseau neuronal (Discriminator) qui identifie si les données d'entrée sont ou non une icône mel. Le Générateur essaie de générer une image qui ressemble autant que possible à une icône mel afin de tromper le Discriminateur, et le Discriminateur apprend à identifier l'image plus précisément. Au fur et à mesure que les deux réseaux de neurones s'entraînent, le générateur sera en mesure de générer des images proches de l'icône mel.

Collecte des ensembles de données

Pour que Generator puisse générer des images qui ressemblent à des icônes Mel et que Discriminator puisse identifier si l'image d'entrée est une icône Mel, apportez autant d'icônes Mel réelles que possible à l'enseignant. Vous devez créer un ensemble de données qui sera les données et l'utiliser pour la formation. J'ai donc fait le tour de Twitter, j'ai trouvé l'icône mel samune, je l'ai sauvegardée à plusieurs reprises et j'ai obtenu plus de 100 feuilles. Utilisez ceci pour apprendre.

Créer un générateur

Laissez le générateur regarder l'icône mel préparée plus tôt et apprenez à générer une image qui lui ressemble. L'image à générer est de 64 x 64 pixels, et la couleur est RVB 3 canaux. Si le générateur génère des données similaires à chaque fois, l'apprentissage ne se déroulera pas correctement, il est donc nécessaire de pouvoir générer autant de types d'images que possible. Par conséquent, entrez une séquence de nombres composée de nombres aléatoires dans le générateur pour la génération d'image. Pour cette séquence de nombres, un processus appelé "convolution de translocation" décrit plus loin est appliqué à chaque couche de convolution pour la rapprocher progressivement d'une image à 3 canaux de 64 x 64 pixels et RVB.

Qu'est-ce que la convolution de translocation?

Pour une convolution normale, comme indiqué ci-dessous, le produit de la somme est pris et sorti tout en décalant le noyau. Dans pytorch, par exemple, il peut être implémenté avec torch.nn.Conv2d.

Source Source

Par contre, dans la convolution de translocation utilisée cette fois, le produit avec le noyau est calculé pour chaque élément, et la somme des résultats obtenus est prise. En tant qu'image, on a l'impression d'agrandir l'élément cible. Dans pytorch, par exemple, il peut être implémenté avec torch.nn.ConvTranspose2d.

Source

Cette couche de convolution de translocation et la couche self_attention (décrite plus loin) se chevauchent et le nombre de canaux de sortie est de 3 dans la dernière couche. (Correspond respectivement à RVB) À partir du contenu ci-dessus, le contour du générateur que vous essayez de créer est comme indiqué dans la figure ci-dessous.

generator_structure.png

Ce générateur a un total de 5 couches de convolution de translocation, avec une couche appelée self_attention entre les 3ème et 4ème couches et entre les 4ème et 5ème couches. En regardant des pixels avec des valeurs similaires à la fois, il est possible d'évaluer l'image entière avec une quantité de calcul relativement faible.

Le générateur configuré de cette manière sort, par exemple, une telle image s'il est dans un état non appris. (Le résultat dépend du nombre de nombres aléatoires que vous entrez.) Comme il n'a pas encore été appris, seul quelque chose comme du bruit peut être émis. Cependant, en s'entraînant mutuellement avec le réseau neuronal (Discriminator) qui identifie si les données d'entrée sont une icône mel ou non, ce qui sera expliqué ci-après, il sera possible de sortir une telle image.

Créer un discriminateur

Demandez au discriminateur de regarder l'image générée par le générateur ci-dessus pour voir s'il s'agit d'une icône mel. Le but est de créer un outil de reconnaissance d'image. L'image d'entrée est de 64 x 64 pixels, la couleur est RVB 3 canaux et la sortie est une valeur (plage de 0 à 1) qui indique à quel point elle ressemble à une icône de mel. En tant que composition, cinq couches de pliage ordinaires sont empilées, et une couche d'auto-attention est prise en sandwich entre les troisième et quatrième couches et entre les quatrième et cinquième couches. La figure est la suivante.

discriminator_structure.png

Méthode d'apprentissage / fonction d'erreur

Les méthodes d'apprentissage de Discriminator et Generator sont décrites ci-dessous.

Discriminateur d'apprentissage

Lorsqu'une image est entrée, Discriminator renvoie un nombre 0 à 1 qui indique à quel point il ressemble à une icône mel. Tout d'abord, entrez l'icône Mel réelle et définissez la sortie (valeur de 0 à 1) à ce moment-là sur $ d_ {real} $. Ensuite, entrez un nombre aléatoire dans le générateur et demandez-lui de générer une image. Lorsque cette image est entrée dans Discriminator, une valeur comprise entre 0 et 1 est également renvoyée. Appelons cela $ d_ {faux} $. Entrez les $ d_ {real} $ et $ d_ {fake} $ qui sortent de cette manière dans la fonction de perte décrite ci-dessous pour obtenir la valeur utilisée pour la propagation des erreurs.

Fonction de perte

L'une des méthodes de GAN, la «version charnière de la perte contradictoire» de SAGAN, utilise la fonction de perte décrite ci-dessous. En termes simples, cette fonction a $ l_ {i} $ et $ l_ {i} ^ {\ prime} $ comme étiquettes correctes, et $ y_ {i} $ et $ y_ {i} ^ {\ prime} $ comme discriminateur. Lorsque la valeur de sortie, $ M $, est le nombre de données par mini-lot

-\frac{1}{M}\sum_{i=1}^{M}(l_{i}min(0,-1+y_{i})+(1-l_{i}^{\prime})min(0,-1-y_{i}^{\prime}))

Est exprimé comme. [^ 1] Cette fois, $ y_ {i} = d_ {real} $, $ y_ {i} ^ {\ prime} = d_ {faux} $, $ l_ {i} = 1 $ (représentant l'icône 100% mel) , $ L_ {i} ^ {\ prime} = 0 $ (indiquant qu'il ne s'agit pas d'une icône de mel absolu)

-\frac{1}{M}\sum_{i=1}^{M}(min(0,-1+d_{real})+min(0,-1-d_{fake}))

ça ira. C'est la fonction de perte du discriminateur utilisée cette fois. Adam a été utilisé comme méthode d'optimisation pour la propagation des erreurs, et le taux d'apprentissage a été fixé à 0,0004, et le moment primaire et le moment secondaire d'Adam (taux d'atténuation exponentielle utilisé pour l'estimation du moment) ont été fixés à 0,0 et 0,9, respectivement.

Générateur d'apprentissage

Lorsqu'une séquence de nombres aléatoires est entrée, Generator essaiera de la faire ressembler autant que possible à une icône mel et de générer une image. Tout d'abord, entrez la séquence de nombres $ z_ {i} $ composée de nombres aléatoires dans le générateur pour obtenir une image. Entrez-le dans Discriminator et sortez une valeur qui montre à quel point il ressemble à une icône mel. Appelons cela $ r_ {i} $.

Fonction de perte

Dans la «version charnière de la perte contradictoire» de SAGAN, la fonction de perte du générateur est définie comme suit:

-\frac{1}{M}\sum_{i=1}^{M}r_{i}

Il semble que SAGAN soit connu pour fonctionner de manière empirique lorsqu'il est défini comme suit. [^ 1] Considérant que $ M $ est le nombre de données par mini-lot, le résultat du jugement de Discriminator est utilisé tel quel. J'ai été un peu surpris de cela, mais qu'en est-il? Adam a été utilisé comme méthode d'optimisation pour la propagation des erreurs, et le taux d'apprentissage a été fixé à 0,0001, et les moments primaire et secondaire d'Adam ont été fixés à 0,0 et 0,9, respectivement. (Identique à Discriminator sauf taux d'apprentissage)

Vue d'ensemble

L'image présentée ci-dessus est réimprimée, mais le générateur et le discriminateur créés précédemment sont combinés de cette manière pour former un GAN. is20tech001zu004-1.jpg

produire

Apprenez à utiliser les icônes de mel réel collectées et laissez le générateur générer des icônes de mel. Gardez le nombre de données $ M $ par mini-lot à 5. Le résultat est le suivant. generated_img64_remastered.png __impressionnant! !! !! !! !! !! !! !! !! !! !! __ __ Impressionné! !! !! !! !! !! !! !! !! !! !! __ À titre de comparaison, un exemple de données d'entrée est affiché sur le côté supérieur, et l'image réellement générée est affichée sur le côté inférieur. De plus, le résultat généré changera à chaque exécution. Personnellement, j'ai été assez surpris de pouvoir faire cela avec un code source qui n'est pas si long. GAN est vraiment génial! !! !! !! !! !! !! !!

Tâche

J'ai fait quelque chose qui peut faire une si grande chose, mais il y a encore des points qui n'ont pas encore été résolus.

Code source

Le code que j'ai écrit se trouve dans ce référentiel. https://github.com/zassou65535/image_generator

Résumé

Le GAN est une technique incroyablement géniale. Malgré l'effondrement du mode, nous avons pu créer quelque chose d'assez proche de l'icône Mel avec à peine près de 100 ensembles de données. Générons également une image palpitante avec GAN.

prime

Si vous faites simplement la moyenne de toutes les icônes Mel que vous avez collectées, vous verrez l'image suivante.

Les références

[^ 1]: Apprendre en créant-Développement par PyTorch Apprentissage en profondeur

Recommended Posts

L'histoire de la création d'un générateur d'icônes mel
L'histoire de la création d'un réseau neuronal de génération musicale
L'histoire de l'exportation d'un programme
L'histoire de la création d'un bot de boîte à questions avec discord.py
L'histoire de la fabrication d'un moule immuable
L'histoire du traitement A du blackjack (python)
L'histoire de la création d'un pilote standard pour db avec python.
L'histoire de la création d'un module qui ignore le courrier avec python
L'histoire de la création d'un robot LINE pour le petit-déjeuner d'une université de 100 yens avec Python
L'histoire de sys.path.append ()
L'histoire de la création d'une caméra sonore avec Touch Designer et ReSpeaker
L'histoire de la création d'un package qui accélère le fonctionnement de Juman (Juman ++) & KNP
L'histoire de la fabrication d'une boîte qui interconnecte la mémoire AL de Pepper et MQTT
L'histoire de la création d'un Line Bot qui nous raconte le calendrier de la programmation du concours
L'histoire du lancement d'un serveur Minecraft depuis Discord
Une histoire qui réduit l'effort de fonctionnement / maintenance
Une histoire sur le changement du nom principal de BlueZ
Le problème Zip 4 Gbyte est une histoire du passé
Une histoire qui a analysé la livraison de Nico Nama.
L'histoire de la construction de Zabbix 4.4
L'histoire du champ de modèle Django disparaissant de la classe
L'histoire de la création d'une base de données à l'aide de l'API Google Analytics
L'histoire de Python et l'histoire de NaN
L'histoire de la participation à AtCoder
L'histoire du "trou" dans le fichier
L'histoire du remontage du serveur d'application
Une histoire coincée avec l'installation de la bibliothèque de machine learning JAX
L'histoire de la création d'un site qui répertorie les dates de sortie des livres
L'histoire de la création d'un outil qui fonctionne sur Mac et Windows sur le site de développement de jeux
Une histoire qui visualise le présent de Qiita avec Qiita API + Elasticsearch + Kibana
L'histoire d'un capteur de stationnement en 10 minutes avec le kit de démarrage GrovePi +
L'histoire d'essayer de reconnecter le client
L'histoire de la mise en place de MeCab dans Ubuntu 16.04
Mesurer la force de l'association dans un tableau croisé
L'histoire du développement d'une application WEB qui génère automatiquement des copies de capture [MeCab]
L'histoire de la manipulation des variables globales Python
[python] [meta] Le type de python est-il un type?
L'histoire de la création d'un slackbot qui génère un gif ou un png lorsque vous envoyez le code de traitement
L'histoire d'essayer deep3d et de perdre
Décodage du modèle LSTM de Keras.
Parlez de la probabilité d'évasion d'une marche aléatoire sur une grille entière
Obtenez le nom de fichier du répertoire (glob)
L'histoire du changement de pep8 en pycodestyle
L'histoire de la création d'un outil pour charger une image avec Python ⇒ l'enregistrer sous un autre nom
Notez l'achèvement d'une commande chronophage
L'histoire de l'adresse IPv6 que je souhaite conserver au minimum
L'histoire de Django créant une bibliothèque qui pourrait être un peu plus utile
L'histoire de la fabrication de soracom_exporter (j'ai essayé de surveiller SORACOM Air avec Prometheus)
L'histoire d'un technicien de haut niveau essayant de prédire la survie du Titanic
Comment calculer la volatilité d'une marque
L'histoire de l'apprentissage profond avec TPU
Visualisez la couche interne du réseau neuronal
Copiez la liste en Python
Trouvez le nombre de jours dans un mois