Ich habe Conditional GAN mit Chainer implementiert. Github - https://github.com/lyakaap/GAN/tree/master/ConditionalGAN
Für die Implementierung habe ich auf den folgenden Artikel verwiesen. http://qiita.com/ysasaki6023/items/55b8545c296ce32ac135
"Bedingte GAN" ist eine Art GAN, und es ist ein wunderbares Modell, mit dem Sie das generierte Bild einer beliebigen Klasse erstellen können, indem Sie die Beschriftung angeben, während Sie das mit der herkömmlichen GAN generierte Bild nicht steuern können. .. Darüber hinaus können andere Bedingungen als Etiketten angegeben werden, und verschiedene Anwendungen sind möglich. Der Unterschied zum Haupt-GAN besteht darin, dass es auch die Etikettendaten übergibt, die der Eingabe des Generators und des Diskriminators entsprechen.
Bei der Implementierung wird berücksichtigt, wie das Label an das Netzwerk übergeben werden kann. Nehmen wir als Beispiel MNIST mit 10 Klassen.
Generator
Werden mit chainer's concat () angehängt.
Insbesondere wenn ich jede Form schreibe,
Es ist geworden. Die "1", die gemeinsam mit den obigen drei Tensoren an die dritte Dimension angehängt wird, ist die Anzahl der Kanäle (natürlich wird sie 3, wenn es sich um RGB-Bilder handelt).
Die Eingabe stellt den Tensor dar, der schließlich zur Eingabe des Generators wird, und wird als "Eingabe = F.concat ((z, l), Achse = 1)" kombiniert.
Discriminator
Wenn es auf DCGAN basiert, befindet sich das Netzwerk in der Faltungsschicht, sodass Sie das One-Hot-Label nicht so übergeben können, wie es ist. Also habe ich den Discriminator-Eingang wie unten gezeigt definiert.
Im obigen Beispiel ist das Eingabebild "2", sodass der entsprechende zweite Kanal gefüllt ist. Indem das One-Hot-Label auf diese Weise wie ein 10-Kanal-Bild behandelt wird, ist es auch mit Convolution kompatibel. Letztendlich wird das kombinierte Beschriftungs- und Eingabebild als 11-Kanal-28x28-Bild (MNIST-Bildgröße) an die Discriminator-Eingabeebene übergeben. Die spezifische Eingabeform ist (Mini-Stapelgröße, 10 + 1 Kanäle, 28, 28) Es sieht aus wie. Concat () wird wie Generator zum Binden verwendet.
Ich habe die Beschriftung des erzeugten Bildes Zeile für Zeile von oben angegeben und die angeordneten visualisiert.
Es ist ein Zustand des Lernens
Sie können sehen, dass wir lernen, dem angegebenen Etikett richtig zu entsprechen.
Als Bonus werde ich auch das nach 300 Epochen erzeugte Bild veröffentlichen, wenn der Ursprung des Eingangsrauschraums als Eingabe verwendet wird. (Die Ausgabe der gleichen Nummer ist natürlich die gleiche)
Wenn man sich die erzeugten Bilder ansieht, macht es Spaß zu sehen, dass die Ursprünge des Rauschraums miteinander verbunden sind, um ein sauberes und neutrales Bild zu erzeugen.
Ich habe auch ein Skript erstellt, das das entsprechende Bild anzeigt, wenn Sie eine beliebige Zahl als Argument eingeben. Selbst mit derselben Nummer werden verschiedene handschriftliche Zeichen der Handschrift ausgegeben.
$ python digit_generator.py --digits 20170710
Es wäre interessant, dies mit einem Hiragana-Datensatz zu tun.
Ich war überrascht, dass Chainer keine One-Hot-Labeling-Funktion wie beim Tensorflow hat. (Vielleicht habe ich es einfach übersehen) Sie können scikit-learn verwenden ...
Übrigens sieht meine Implementierung so aus.
def to_onehot(label, class_num):
return numpy.eye(class_num)[label]
Wenn Sie das Label und die Anzahl der Klassen übergeben, wird ein One-Hot-Label basierend auf der Einheitenmatrix ausgegeben.
Recommended Posts