[PYTHON] Lernen Sie Wasserstein GAN mit Keras-Modell und TensorFlow-Optimierung

Einführung


In letzter Zeit ist das Deep-Generation-System, das sogenannte GAN, heiß. Ich probiere auch verschiedene Dinge aus und spiele. Die Bibliothek ist intuitiv und leicht zu verstehen.

Übrigens können gewöhnliches DCGAN und Wasserstein GAN auch mit Keras schnell implementiert und erlernt werden, aber wenn es um diejenigen geht, die geringfügige Verbesserungen wie die Fehleroptimierung vorgenommen haben: "Wie schreiben Sie dies in Keras? ,,? ”Ich denke, es kann passieren. Ich habe dies mit der in Verbessertes Training von Wasserstein-GANs vorgeschlagenen Implementierung der Gradientenstrafe getan. Ich werde die Erklärung der Gradientenstrafe weglassen, aber ich denke, es wäre gut, wenn das Modell in Keras definiert und das Lernen in TensorFlow durchgeführt würde. Ich dachte, ich habe es geschafft, dies mit normalem Wasserstein GAN gut zu lernen, also würde ich gerne einen Artikel schreiben. Ich bin froh, wenn Sie es als Referenz verwenden können. Platzieren Sie den Code unter hier.

Requirements

Modellbau (Keras)


Generator und Diskriminator werden von Keras geschrieben. Es ist einfach. (Siehe model.py) Der Generator verwendet Deconvolution (Filtergröße 4 * 4, Schritt 2 * 2), um zufällige Eingaben in ein Bild umzuwandeln. Der Diskriminator gibt den Funktionswert aus dem Eingabebild durch Faltung aus (Filtergröße 4 * 4, Schritt 2 * 2). Ich habe es in Keras 'Functional API Model geschrieben, aber es sollte kein Problem mit dem Sequential Model geben (Schreibmethode, die mit model.add verbunden ist).

Lernen (TensorFlow)


In Wasserstein GAN übernimmt Discriminator die Ausgabe von Funktionswerten, anstatt die Authentizität des Eingabebilds zu bestimmen.

\max_{D} \min_{G} \mathbb{E}_{x\sim p(x)}D(x) - \mathbb{E}_{z \sim p(z)}D(G(z))

Dies macht das Gradientenlernen stabiler als das ursprüngliche GAN, wodurch die Jensen-Shannon-Divergenz minimiert wird. Weitere Informationen finden Sie im Originalpapier (https://arxiv.org/abs/1701.07875) und in anderen Kommentaren. Bitte gib mir.

Geben Sie im Fall von Keras normalerweise die vorbereitete oder von Ihnen und model.compile definierte Verlustfunktion an. In diesem Artikel wird diese Optimierung jedoch von TensorFlow durchgeführt.

main.py


class WassersteinGAN:

    def __init__(self, ...):

        self.image_size = 64
        self.gen = generator # model.Generator in py definiert
        self.disc = discriminator # model.Diskriminator in py definiert
        
        #Das Eingabebild und die Eingabezufallszahl werden durch Platzhalter definiert.
        self.x = tf.placeholder(tf.float32, (None, self.image_size, self.image_size, 3), name = 'x') #Echtes Bild
        self.z = tf.placeholder(tf.float32, (None, 100), name = 'z') #Zufallszahl eingeben
        self.x_ = self.gen(self.z) #Gefälschtes Bild<-Zufallszahl eingeben
        
        self.d = self.disc(self.x) #Ausgabe mit echtem Bild als Eingabe
        self.d_ = self.disc(self.x_) #Ausgabe mit gefälschtem Bild als Eingabe

        self.d_loss = -(tf.reduce_mean(self.d) - tf.reduce_mean(self.d_)) #Diskriminator Zielfunktion
        self.g_loss = -tf.reduce_mean(self.d_) #Generatorzielfunktion

        #Optimierer einstellen. Die Lernrate des Generators ist etwas kleiner eingestellt.
        self.d_opt = tf.train.RMSPropOptimizer(learning_rate = 5e-5)\
                     .minimize(self.d_loss, var_list = self.disc.trainable_weights)
        self.g_opt = tf.train.RMSPropOptimizer(learning_rate = 1e-5)\
                     .minimize(self.g_loss, var_list = self.gen.trainable_weights)

        #Legen Sie die Sitzung von TensorFlow fest.
        self.sess = tf.Session()
        K.set_session(self.sess) #← In Kombination mit Keras erscheint dies erforderlich

    def train(self, ...):

Unter diesen Einstellungen werden wir die Daten tatsächlich fließen lassen und lernen.

In meinem Code eine Klasse zum Abrufen von Eingabebildern und Eingabe von Zufallszahlen (misc / dataIO.py, InputSampler ) Wurde gemacht, Der im folgenden Code angezeigte Sampler ist eine Instanz dieses InputSamplers. Die image_sample-Methode gibt einen Mini-Stapel realer Bilder zurück, und die Noise_sample-Methode gibt einen Mini-Stapel von Eingabe-Zufallszahlen zurück. Die Nachlademethode ist eine Methode zum Teilen und Halten einer großen Anzahl von Bildern von Trainingsdaten. (Da der häufig verwendete Gesichtsbilddatensatz CelebA mehr als 200.000 Bilder enthält, haben wir diese Spezifikation zur Vereinfachung des Speichers erstellt.)

Wenn das von Keras implementierte Modell die Stapelnormalisierung enthält, muss beim Datenfluss K.learning_phase () festgelegt werden. Einschließlich dessen wird es im folgenden Code beschrieben.

main.py


class WassersteinGAN:

    def __init__(self, ...):

    # --Abkürzung--

    def train(self, ...):
        
        for e in range(epochs):
            for batch in range(num_batches):

                #Diskriminator lernt viel
                for _ in range(5):
                    #Gewichtsbeschneidung zur Gewährleistung der Lipsitz-Kontinuität
                    d_weights = [np.clip(w, -0.01, 0.01) for w in self.disc.get_weights()]
                    self.disc.set_weights(d_weights)

                    #Mini-Stapel von echten Bildern
                    bx = sampler.image_sample(batch_size)
                    #Mini-Stapel von Eingabe-Zufallszahlen
                    bz = sampler.noise_sample(batch_size)
                    #Eingabe und K, um zum Platzhalter zu fließen.learning_phase()Diskriminator durch Angabe lernen
                    self.sess.run(self.d_opt, feed_dict = {self.x: bx, self.z: bz,
                                                           K.learning_phase(): 1})

                bz = sampler.noise_sample(batch_size, self.z_dim)
                #Eingabe und K, um zum Platzhalter zu fließen.learning_phase()Generator durch Angabe lernen
                self.sess.run(self.g_opt, feed_dict = {self.z: bz,
                                                       K.learning_phase(): 1})

                #Bei der Ausgabe von Verlust
                d_loss, g_loss = self.sess.run([self.d_loss, self.g_loss],
                                               feed_dict = {self.x: bx, self.z: bz,
                                                            K.learning_phase(): 1})
                print('epoch : {}, batch : {}, d_loss : {}, g_loss : {}'\
                      .format(e, batch, d_loss, g_loss))
        

~~ Da das Modell in Keras beschrieben ist, können Parameter durch die Keras-Formel gespeichert werden. Ich rette oft jede Epoche. ~~ ~~ * Wenn Sie versuchen, das Modell in einer TensorFlow-Sitzung auf Keras-Weise zu speichern, funktioniert es möglicherweise nicht. bestätigen. ~~ Modellparameter können mit dem Keras-Ausdruck `model.save_weights ()` gespeichert werden. Sie können gespeicherte Parameter auch mit `model.load_weights ()` laden.

main.py


class WassersteinGAN:

    def __init__(self, ...):

    # --Abkürzung--

    def train(self, ...):
        
        for e in range(epochs):
            for batch in range(num_batches):
            
            # --Abkürzung--

            #Parameter können auf Keras-Weise gespeichert werden
            self.gen.save_weights('path/to/g_{}epoch.h5'.format(e))
            self.disc.save_weights('path/to/d_{}epoch.h5'.format(e))

Das hat mich ziemlich gut unterrichtet, aber das erzeugte Bild war etwas verschwommen. Im Allgemeinen scheint Wasserstein GAN ein wenig verschwommen zu sein als DCGAN, aber ich bin der Meinung, dass es je nach Einstellung wie Lernrate wunderbar generiert werden kann.

Schließlich


Auf diese Weise konnte ich mit Keras ein Modell bauen und mit TensorFlow trainieren. In letzter Zeit habe ich das Gefühl, dass viele Methoden mit ausgefeilter Optimierung vorgeschlagen wurden, und ich hoffe, dass sie bei den Folgetests hilfreich sein werden. Bitte zögern Sie nicht, uns zu kontaktieren, wenn Sie Vorschläge oder Verbesserungen haben.

Nachtrag


Ich habe den Code geschrieben, um mit Keras und Tensorflow auf die gleiche Weise mit einem einfachen CNN zu lernen. Wenn Sie GAN mögen, ist hier leicht zu verstehen.

Recommended Posts

Lernen Sie Wasserstein GAN mit Keras-Modell und TensorFlow-Optimierung
Vergleichen Sie rohen TensorFlow mit tf.contrib.learn und Keras
Ich habe versucht, Grad-CAM mit Keras und Tensorflow zu implementieren
[How to!] Lerne und spiele Super Mario mit Tensorflow !!
Effizientes GAN mit Keras implementiert
Ich berührte Tensorflow und Keras
MNIST (DCNN) mit Keras (TensorFlow-Backend)
Passen Sie Modell / Ebene / Metrik mit TensorFlow an
[TensorFlow 2] Lernen Sie RNN mit CTC-Verlust
[TensorFlow] [Keras] Aufbau eines neuronalen Netzwerks mit Keras
Vergleichen Sie DCGAN und pix2pix mit Keras
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras 9 heraus. Lernen, Speichern und Laden von Modellen
Versuchen wir das TensorFlow-Musikgenerierungsprojekt "Magenta" von der Entwicklungsumgebung bis zur Songgenerierung.
Lernen Sie Wasserstein GAN mit Keras-Modell und TensorFlow-Optimierung
[How to!] Lerne und spiele Super Mario mit Tensorflow !!
[Lesehinweis] Praktisches maschinelles Lernen mit Scikit-Learn, Keras und TensorFlow Kapitel 1
Automatisierung der Parameteroptimierung mit Keras mit GridSearch CV
Lernen Sie mit TensorFlow Y = 2X verteilte Daten
Anwenden der Bayes'schen Optimierung auf das Keras-DNN-Modell
Klassifizierte ImageNet Hamburger und Fahrräder von Keras
Verwenden Sie TPU und Keras mit Google Colaboratory
Implementieren Sie ein Modell mit Status und Verhalten
Probieren Sie TensorFlows RNN mit einem Basismodell aus
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Laden Sie das Kaffeemodell mit Chainer und klassifizieren Sie die Bilder
Erste Schritte mit der japanischen Übersetzung des Keras Sequential-Modells
Belichtung des DCGAN-Modells für Cifar 10 mit Keras
Mit OR-Tools erlernte Optimierung [Lineare Planung: Mehrstufiges Modell]
Lösen des Lorenz 96-Modells mit Julia und Python
Laden Sie die TensorFlow-Modelldatei .pb mit readNetFromTensorflow ().
Portfoliooptimierung mit Python (Markovitz-Durchschnittsverteilungsmodell)
Fordern Sie die Bildklassifizierung mit TensorFlow2 + Keras heraus. 6-Versuchen Sie, die von Ihnen erstellten Bilder vorzuverarbeiten und zu klassifizieren.