[PYTHON] Implémentation du GAN conditionnel avec chainer

introduction

J'ai implémenté le GAN conditionnel avec chainer. Github - https://github.com/lyakaap/GAN/tree/master/ConditionalGAN

Pour la mise en œuvre, je me suis référé à l'article suivant. http://qiita.com/ysasaki6023/items/55b8545c296ce32ac135

Commentaire

"Conditional GAN" est une sorte de GAN, et c'est un modèle merveilleux que vous pouvez faire l'image générée de n'importe quelle classe en spécifiant l'étiquette, alors que vous ne pouvez pas contrôler l'image générée par le GAN conventionnel. .. De plus, les conditions à spécifier peuvent être autres que les étiquettes et diverses applications sont possibles. La différence avec le GAN principal est qu'il transmet également les données d'étiquette correspondant à l'entrée du générateur et du discriminateur.

la mise en oeuvre

En tant que considération lors de la mise en œuvre, "comment passer le label au réseau" devient important. Prenons l'exemple de MNIST avec 10 classes.

Generator

Sont attachés à l'aide de concat () de chainer.

Plus précisément, lorsque j'écris chaque forme,

Il est devenu. Le "1" attaché à la troisième dimension commune aux trois tenseurs ci-dessus est le nombre de canaux (il devient naturellement 3 lors de la manipulation d'images RVB).

input représente le tenseur qui deviendra finalement l'entrée du générateur, et est combiné comme ʻinput = F.concat ((z, l), axis = 1) `.

Discriminator

S'il est basé sur DCGAN, le réseau se trouve dans la couche de convolution, vous ne pouvez donc pas passer le one-hot label tel quel. J'ai donc défini l'entrée Discriminator comme indiqué ci-dessous.

スクリーンショット 2017-07-11 20.01.38.png

Dans l'exemple ci-dessus, l'image d'entrée est "2", de sorte que le deuxième canal correspondant est rempli. En traitant ainsi l'étiquette one-hot comme une image à 10 canaux, elle est également compatible avec la convolution. Finalement, l'étiquette combinée et l'image d'entrée seront transmises à la couche d'entrée Discriminator sous la forme d'une image 28x28 à 11 canaux (taille d'image MNIST). La forme d'entrée spécifique est (Mini taille de lot, 10 + 1 canaux, 28, 28) On dirait. Comme Generator, concat () est utilisé pour la liaison.

résultat

J'ai spécifié le libellé de l'image générée ligne par ligne à partir du haut et visualisé les rangées.

C'est un état d'apprentissage

ConditionalGAN.gif

Vous pouvez voir que nous apprenons à correspondre correctement à l'étiquette spécifiée.

De plus, en prime, je publierai l'image générée après 300 époques lorsque l'origine de l'espace de bruit d'entrée est utilisée comme entrée. (La sortie du même numéro est, bien sûr, la même)

image180000.png

En regardant les images générées, il est amusant de voir que les origines de l'espace de bruit sont associées les unes aux autres de manière à générer une image nette et neutre.

J'ai également créé un script qui affiche l'image correspondante lorsque vous entrez un nombre arbitraire comme argument. Même avec le même numéro, divers caractères manuscrits de l'écriture manuscrite sont émis.

$ python digit_generator.py --digits 20170710
スクリーンショット 2017-07-12 17.28.22.png スクリーンショット 2017-07-12 17.28.02.png

Il serait intéressant de le faire avec un jeu de données Hiragana.

Autre

J'ai été surpris que le chainer n'ait pas de fonction d'étiquetage à chaud comme dans tensorflow. (Peut-être que je l'ai juste oublié) Vous pouvez utiliser scikit-learn ...

Au fait, ma mise en œuvre ressemble à ceci.

def to_onehot(label, class_num):
    return numpy.eye(class_num)[label]

Si vous passez l'étiquette et le nombre de classes, il produira une étiquette unique basée sur la matrice d'unité.

Recommended Posts

Implémentation du GAN conditionnel avec chainer
Implémentation d'un GAN efficace avec keras
Implémentation de SmoothGrad avec Chainer v2
Seq2Seq (1) avec chainer
Essayez d'implémenter RBM avec chainer.
Implémentation de word2vec avec Theano + Keras
Génération du caractère indésirable MNIST (KMNIST) avec cGAN (GAN conditionnel)
Apprenez les orbites elliptiques avec Chainer
Seq2Seq (3) ~ Edition CopyNet ~ avec chainer
J'ai essayé d'implémenter VQE avec Blueqat
Utilisation du chainer avec Jetson TK1
Réseau de neurones commençant par Chainer
Génération de légende d'image avec Chainer
Clustering embarqué profond avec Chainer 2.0
Un peu coincé dans le chainer
Zura avec fonction softmax implémentée
[Classification de texte] J'ai essayé d'implémenter des réseaux de neurones convolutifs pour la classification des phrases avec Chainer
Téléchargement de fichiers implémenté avec Python + Bottle
Perceptron multicouche avec chaînette: ajustement fonctionnel
Essayez de prédire les courses de chevaux avec Chainer
J'ai essayé d'implémenter Attention Seq2Seq avec PyTorch
Exécuter l'inférence avec l'exemple de Chainer 2.0 MNIST
Générer de fausses données de table avec GAN
Utilisation de Chainer avec CentOS7 [Construction de l'environnement]
Essayez l'apprentissage de la représentation commune avec le chainer
Seq2Seq (2) ~ Attention Model edition ~ avec chainer
Implémentation de la méthode de différence inter-trame avec OpenCV