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
"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.
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.
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.
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
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)
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
Il serait intéressant de le faire avec un jeu de données Hiragana.
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