[PYTHON] Implementieren Sie BEGAN (Boundary Equilibrium Generative Adversarial Networks) mit Keras

Einführung

In letzter Zeit sehe ich oft einen interessanten Strukturmechanismus im Generationsmodell namens GAN (Generative Adversarial Networks). Die Struktur, in der der Generator und der Diskriminator miteinander konkurrieren, um die Genauigkeit zu verbessern, ist wie eine Übereinstimmung zwischen dem Generator und dem Diskriminator in der Kunstwelt, eine Welt wie eine Galerie-Fälschung. Erinnert an. Ich fühle Romantik im Mechanismus selbst. Darüber hinaus ist es wirklich seltsam, weil es genau erzeugen kann.

Es scheint jedoch, dass das Problem mit GAN darin bestand, dass es schwierig zu lernen war, aber dieses BEGAN lernt, während der Konflikt zwischen beiden ausgeglichen wird. Es wird gesagt, dass dieses Problem dadurch gelöst wird. BEGAN war ziemlich einfach und leicht zu verstehen, also habe ich es mit Keras implementiert.

Interessanter Teil von BEGAN

Es scheint, dass es einen Mechanismus zum Ausbalancieren gibt, während verschiedene GAN-Verbesserungen geerbt werden, aber ich persönlich fand ihn aufgrund der in dem Artikel beschriebenen Funktionen interessant (einschließlich derjenigen, die andere Leute zuvor gedacht haben) Als Teil,

Das Interessanteste ist jedoch

Wenn die Verlustfunktion des AutoEncoders von Discriminator $ L (x) $ ist, Die Verlustfunktion des Diskriminators sei $ L_ {D} (x) $ und die Verlustfunktion des Generators sei $ L_ {G} (x) $.

$ L_ {D} (x) = L (wahres Bild) --k_ {t} * L (vom Generator erzeugtes Bild) $ $ L_ {G} (x) = L (vom Generator erzeugtes Bild) $ $ k_ {t + 1} = k_ {t} + \ lambda_ {k} (\ gamma * L (wahres Bild) - L (vom Generator erzeugtes Bild)) $

Es ist ein Ort zum Lernen in Form von. Dieses $ k_ {t} $ scheint bei 0 zu beginnen und allmählich zuzunehmen.

Der Diskriminator ist gezwungen, die Aktionen "hart am AutoEncode des echten Bildes arbeiten (Verlust verkleinern)" und "nicht hart am AutoEncoder des gefälschten Bildes arbeiten (Verlust größer machen)" auszuführen, um den Verlust zu verringern. Da k = 0 ist, werden wir zunächst den AutoEncoder des wahren Bildes optimieren, aber wir werden auch Anstrengungen unternehmen, um den Verlust des Generatorbildes zu erhöhen, wenn k allmählich zunimmt. Am Ende erreicht k den Gleichgewichtszustand, wenn $ (\ gamma * L (wahres Bild) - L (vom Generator erzeugtes Bild)) = 0 $ (zu diesem Zeitpunkt tritt $ \ gamma $ in Kraft. Ne).

Da der Generator das generierte Bild immer so gestaltet, dass der Verlust des Auto-Encoders kleiner wird, wird die Konkurrenz allmählich komplexer.

Dieser dilemmaähnliche Mechanismus war sehr interessant und ich dachte, er wurde klar ausgedrückt (nun, ich weiß nicht viel über andere GANs ...).

Implementierung

Quellcode

https://github.com/mokemokechicken/keras_BEGAN Es wird in platziert.

Ich denke, dass es als Implementierung geeignet ist, weil es ein Bild erzeugen kann, das so aussieht ...

Mit Keras ist es schwierig, solche ungewöhnlichen Modelle und Lernprozesse durchzuführen (es gibt nicht viele Beispiele), aber wenn Sie erst einmal verstanden haben, wie man es schreibt, ist es tatsächlich nicht so schwierig, und wenn Sie es erst einmal erstellt haben, ist es aufgrund seiner hohen Modularität leicht zu lesen. Es hat den Vorteil, dass es auf verschiedene Arten einfach anzuwenden ist.

Lernfortschritt

Das Auftragen der Werte verschiedener Verluste für jede Charge ist wie folgt. Ich trainiere mit $ \ gamma = 0.5 $.

training.png

Die Bedeutung jedes Wertes ist wie folgt.

Woran ich denke, wenn ich Pat sehe

Generierungsbeispiel nach Ausführung

Beispielbild

Jedes quadratische Bild mit 64 x 64 Pixel ist in Ordnung, aber als Beispielbild http://vis-www.cs.umass.edu/lfw/

[new] All images aligned with deep funneling 
(111MB, md5sum 68331da3eb755a505a502b5aacb3c201)

Ich durfte benutzen. Ohne das Graustufenbild gibt es 13194 Beispiele.

Generiertes Bild

Als ich die erzeugten Bilder nach dem Lernfortschritt ordnete, sah es so aus.

Epoch 1
Epoch 25
Epoch 50
Epoch 75
Epoch 100
Epoch 125
Epoch 150
Epoch 175
Epoch 200
Epoch 215

Als Gesichtsfoto ist bis etwa Epoche 125 recht gut. Danach, wahrscheinlich weil ich versucht habe, den Hintergrund zu erfassen, ist die Störung des Gesichtsteils erstaunlich. Wenn Sie sich auf das Gesicht konzentrieren und es erzeugen möchten, ist es möglicherweise etwas schöner, wenn Sie das mit dem Hintergrund und nur dem Gesicht verwenden. Es scheint, dass die Anzahl der Conv-Ebenen des Modells damit zusammenhängt, wie schön das Bild ist, und dass es möglicherweise etwas kurz war.

Ausführungszeit

Es war ungefähr 680 Sekunden / Epoche mit den folgenden Maschinenspezifikationen.

schließlich

Ich habe das Gefühl, endlich etwas über GAN gelernt zu haben.

Recommended Posts

Implementieren Sie BEGAN (Boundary Equilibrium Generative Adversarial Networks) mit Keras
Implementieren Sie LSTM AutoEncoder mit Keras