[PYTHON] Rekonstruktion des sowjetischen Propagandaplakats von PyTorch x VAEGAN

Überblick

Wir setzen das letzte Mal fort und implementieren verschiedene Dinge als Programmierpraxis. Dieses Mal werde ich VAEGAN verwenden, um das Propagandaplakat zu rekonstruieren. (Plötzlich warum die Sowjetunion? Es ist wirklich nur ein Hobby. Es gibt keine politischen Ansprüche.)

Wenn Sie technische Vorschläge haben, würde ich mich freuen, wenn Sie einen Kommentar abgeben könnten. Was Sie in diesem Artikel verstehen können, ist der Grad der Rekonstruktion von VAEGAN und Punkte, die Sie beim Erlernen von GAN beachten sollten.

** Der Rekonstruktionsfluss ist wie folgt. ** ** **

  1. Propagandaplakate sammeln (Lerndaten)
  2. Lernen Sie mit VAEGAN
  3. Rekonstruieren Sie die Daten mit dem trainierten Modell

Darüber hinaus basiert die Implementierung von VAEGAN von PyTorch auf hier. Vielen Dank.

Über VAEGAN

Autoencoding beyond pixels using a learned similarity metric In einem normalen einfachen GAN gibt es zwei Modelle, Generator und Diskriminator, und sie können durch feindliches Lernen miteinander lernen, so dass ein guter Generator lernen kann. Das Problem mit GAN ist jedoch, dass der ** Generatoreingang zufälliges Rauschen ist. ** Was ich meine ist, dass die Eingabe zufällig ist, also möchte ich diese Daten explizit! Trotzdem ist es nicht möglich, die Zieldaten mit normalem GAN zu generieren. VAEGAN hingegen soll es Ihnen ermöglichen, die gewünschten Daten explizit zu rekonstruieren. Dies bedeutet, dass der Generator durch VAE ersetzt wurde.

Dieses Mal werde ich die Daten von Plakaten im sowjetischen Stil explizit rekonstruieren.

Trainingsdaten sammeln

Ich habe [Image Downloader] verwendet (https://chrome.google.com/webstore/detail/image-downloader/cnpniohnfphhjihaiiggeabnkjhpaldj). Diese Erweiterung für Chrom ist unglaublich nützlich beim Sammeln von Trainingsdaten. es wird empfohlen. Und ich habe ungefähr 300 Blätter der folgenden Daten gesammelt.

images - 2020-03-15T221053.608.jpegimages-2020-03-15T221053.628.jpegimages-2020-03-15T221053.657.jpeg

Nein, dieses avantgardistische Gefühl ist wunderbar! (Es ist nur ein Hobby)

Lernen Sie mit VAEGAN

Für die Implementierung habe ich mich grundsätzlich auf das Obige bezogen. Es gab jedoch Zeiten, in denen ich nicht so gut lernen konnte (Rekonstruktion fehlgeschlagen), daher nehme ich einige Korrekturen vor. ** Es gibt zwei Haupttypen: Fehlerfunktion und Modelldefinition. ** ** **

Die Fehlerfunktion hat L_llike von Enc_loss in train.py wie folgt in none geändert. Außerdem wurde Dec_loss's L_gan_fake ohne es geändert. Die beiden oben genannten L_llike und L_gan_fake scheinen die Funktionen von Discriminator in die Fehlerfunktion zu integrieren. In meiner Umgebung war es leider nicht möglich, mit der ursprünglichen Version ...

train.py


# Enc_loss ---
    Enc_loss = L_prior + L_recon 
    Enc_loss.backward()
    Enc_optimizer.step()
    Enc_running_loss += Enc_loss.item()

    # train Decoder ===
    Dec_optimizer.zero_grad()

    x_real = Variable(data)
    z_fake_p = Variable(torch.randn(opt.batch_size, opt.nz))
    if opt.use_gpu:
      x_real = x_real.cuda()
      z_fake_p = z_fake_p.cuda()
    x_fake, mu, logvar = G(x_real)

    # L_gan ---
    y_real_loss = bce_loss(D(x_real), t_fake)
    y_fake_loss = bce_loss(D(x_fake), t_real)
    y_fake_p_loss = bce_loss(D(G.decoder(z_fake_p)), t_real)
    L_gan_fake = (y_real_loss + y_fake_loss + y_fake_p_loss) / 3.0

    # L_llike ---
    L_recon = opt.gamma * l1_loss(x_fake, x_real)
    L_llike = l1_loss(D.feature(x_fake), D.feature(x_real))

    # Dec_loss ---
    Dec_loss = L_recon + L_llike
    Dec_loss.backward()
    Dec_optimizer.step()
    Dec_running_loss += Dec_loss.item()

In der Modelldefinition bestehen die wichtigsten Änderungen darin, dass die Aktivierungsfunktion jedes Modells auf LeakyReLU festgelegt ist und BatchNorm2d von Discriminator entfernt wird. Die Eingangsgröße beträgt 128 x 128 und der Kanal 3, da es sich um ein Farbbild handelt.

Rekonstruieren Sie Daten mithilfe eines trainierten Modells

Ich habe train.py gedreht und das Rekonstruktionsergebnis alle 100 Epochen im Protokollverzeichnis gespeichert. Berechnet mit Epoche = 1000, Chargengröße = 16 und latenter Variablendimension = 32. Das Rekonstruktionsergebnis ist wie folgt. Der obere Teil jedes Bildes ist das Eingabebild und der untere Teil ist das Ausgabeergebnis von VAEGAN.

100epoch reconstructed_epoch0100.png 300epoch reconstructed_epoch0300.png 600epoch reconstructed_epoch0600.png 1000epoch reconstructed_epoch1000.png

Erwägung

VAEGAN Ich fand es ehrlich gesagt unglaublich. In der 100. Epoche ist das Rekonstruktionsergebnis verschwommen, aber wenn Sie 1000epoch drehen, können Sie es perfekt reproduzieren, so dass es fast keinen Unterschied zur Realität gibt (Eingabe). Das am Anfang dieses Artikels erwähnte VAEGAN-Papier hat auch einen Vergleich mit VAE durchgeführt, und ich wusste, dass es äußerst sauber rekonstruiert werden kann, aber diese Überprüfung hat mich dazu gebracht, es wieder zu erkennen. ** Aber es gibt viele Dinge zu beachten, wenn Sie GAN lernen. ** ** ** Erstens ist das GAN-Lernen in der Regel kompliziert und schwer zu stabilisieren, daher müssen wir auf den Übergang von Diskriminierungsverlust und anderen Modellen achten. Fälle, die nicht funktionieren, sind der Verlust des Diskriminators, der mit einer enormen Geschwindigkeit konvergiert, oder der andere Verlust, der überhaupt nicht konvergiert und eher divergiert. Dieses Mal gab es einen Fall, in dem Discriminator abrupt konvergierte, sodass ich BatchNorm2d von Discriminator entfernte. Es scheint auch, dass Leaky ReLU in neueren GAN-Modellen anstelle von ReLU verwendet wird. Darüber hinaus ist hier auch als Gegenmaßnahme für Situationen hilfreich, in denen das GAN-Lernen nicht gut verläuft.

Recommended Posts

Rekonstruktion des sowjetischen Propagandaplakats von PyTorch x VAEGAN
Zusammenfassung der grundlegenden Implementierung von PyTorch
Rekonstruktion von bewegten Bildern mit dem Autoencoder unter Verwendung von 3D-CNN