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.
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 ...).
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.
Das Auftragen der Werte verschiedener Verluste für jede Charge ist wie folgt. Ich trainiere mit $ \ gamma = 0.5 $.
Die Bedeutung jedes Wertes ist wie folgt.
Woran ich denke, wenn ich Pat sehe
loss_real_x * gamma = loss_gen_x
ist richtig konvergiertJedes 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.
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.
Es war ungefähr 680 Sekunden / Epoche mit den folgenden Maschinenspezifikationen.
Linux
Dataset: All images aligned with deep funneling (13194 samples)
Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz
GeForce GTX 1080
Environment Variables
KERAS_BACKEND=theano
THEANO_FLAGS=device=gpu,floatX=float32,lib.cnmem=1.0
Ich habe das Gefühl, endlich etwas über GAN gelernt zu haben.