[PYTHON] GAN: DCGAN Part2-Training DCGAN-Modell

Ziel

Dies ist eine Fortsetzung von DCGAN mit dem Microsoft Cognitive Toolkit (CNTK).

In Teil 2 wird das DCGAN-Training von CNTK unter Verwendung der in Teil 1 erstellten Bilddaten durchgeführt. Es wird davon ausgegangen, dass CNTK und NVIDIA GPU CUDA installiert sind.

Einführung

In GAN: DCGAN Part1 - Scraping Web Images habe ich das Gesichtsbild meines Lieblingskünstlers aus Bing Image Search vorbereitet.

In Teil 2 werden wir ein Gesichtsgenerierungsmodell unter Verwendung des Deep Convolutional Generative Adversarial Network (DCGAN) erstellen und trainieren.

Deep Convolutional Generative Adversarial Network Das diesmal implementierte DCGAN [1] besteht aus zwei neuronalen Netzen, wie in der folgenden Abbildung gezeigt. Wobei $ x $ einen realen Bilddatensatz darstellt und $ z $ eine latente Variable darstellt.

dcgan.png

Die Netzwerkstruktur von Generator und Diskriminator wurde wie folgt eingestellt.

Generator Der Generator verwendet die Translokationsfaltung mit Kernelgröße 5 und Schritt 2.

Führen Sie unmittelbar nach der Translokationsfaltungsschicht die Chargennormalisierung [2] aus und wenden Sie dann die Aktivierungsfunktion ReLU an. Daher wird der Bias-Term nicht in die Translokationsfaltungsschicht übernommen.

Die Translokationsfaltung der letzten Schicht verwendet einen Bias-Term und wendet die Aktivierungsfunktion tanh an, ohne die Chargennormalisierung zu verwenden.

Layer Filters Size/Stride Input Output
ConvolutionTranspose2D 1024 4x4/2 100 4x4x1024
ConvolutionTranspose2D 512 5x5/2 4x4x1024 8x8x512
ConvolutionTranspose2D 256 5x5/2 8x8x512 16x16x256
ConvolutionTranspose2D 128 5x5/2 16x16x256 32x32x128
ConvolutionTranspose2D 64 5x5/2 32x32x128 64x64x64
ConvolutionTranspose2D 32 5x5/2 64x64x64 128x128x32
ConvolutionTranspose2D 3 5x5/2 128x128x32 256x256x3

Die vorherige Verteilung der latenten Variablen $ z $ ist die Standardnormalverteilung $ \ mathcal {N} (0.0, 1.0) $.

Discriminator Der Diskriminator verwendet eine Kernelgröße 3 und eine Schritt 2-Faltung.

Führen Sie die Chargennormalisierung unmittelbar nach der Faltungsschicht aus und wenden Sie dann die Aktivierungsfunktion Leaky ReLU [3] an. Daher wird der Bias-Term nicht in die Faltschicht übernommen. Der Parameter Leaky ReLU wurde auf 0,2 gesetzt. Die Chargennormalisierung wird jedoch nicht für die Faltung der ersten Schicht verwendet.

Die Faltung der letzten Schicht verwendet einen Bias-Term und wendet das Sigmoid der Aktivierungsfunktion ohne Verwendung der Chargennormalisierung an.

Layer Filters Size/Stride Input Output
Convolution2D 32 3x3/2 256x256x3 128x128x32
Convolution2D 64 3x3/2 128x128x32 64x64x64
Convolution2D 128 3x3/2 64x64x64 32x32x128
Convolution2D 256 3x3/2 32x32x128 16x16x256
Convolution2D 512 3x3/2 16x16x256 8x8x512
Convolution2D 1024 3x3/2 8x8x512 4x4x1024
Convolution2D 1 4x4/1 4x4x1024 1

Einstellungen im Training

Der Anfangswert der Parameter der Translokationsfaltung / Faltungsschicht wurde auf die Normalverteilung [1] mit einer Varianz von 0,02 eingestellt.

Die diesmal implementierte Verlustfunktion ist in der folgenden Gleichung dargestellt. [4]

\max_{D} \mathbb{E}_{x \sim p_r(x)} [\log D(x)] + \mathbb{E}_{z \sim p_z(z)} [\log(1 - D(G(z))]\\
\max_{G} \mathbb{E}_{z \sim p_z(z)} [\log D(G(z))]

Hier stehen $ D $ und $ G $ für Diskriminator bzw. Generator, $ x $ ist das Eingabebild, $ z $ ist die latente Variable, $ p_r $ ist die Verteilung realer Bilddaten und $ p_z $ ist das gefälschte Bild. Es stellt die vorherige Verteilung dar, die die Daten erzeugt.

Adam [5] wurde als Optimierungsalgorithmus sowohl für den Generator als auch für den Diskriminator verwendet. Die Lernrate wurde auf 1e-4 gesetzt, Adams Hyperparameter $ β_1 $ wurde auf 0,5 gesetzt und $ β_2 $ wurde auf den Standardwert von CNTK gesetzt.

Das Modelltraining führte 50.000 Iterationen mit Mini-Batch-Training der Mini-Batch-Größe 16 durch.

Implementierung

Ausführungsumgebung

Hardware-

・ CPU Intel (R) Core (TM) i7-6700K 4,00 GHz

Software ・ Windows 10 Pro 1909 ・ CUDA 10.0 ・ cuDNN 7.6 ・ Python 3.6.6 ・ cntk-gpu 2.7 ・ Opencv-Contrib-Python 4.1.1.26 ・ Numpy 1.17.3 ・ Pandas 0.25.0

Programm zum Ausführen

Das Schulungsprogramm ist auf [GitHub] verfügbar (https://github.com/sho-watari/GAN/tree/master/DCGAN).

dcgan_training.py


Kommentar

Hier ist eine Liste einiger GAN-Trainingstechniken, die in Wie man ein GAN trainiert? eingeführt wurden und besonders hilfreich waren.

Input Normalization Normalisieren Sie das Eingabebild auf [-1, 1]. Stellen Sie daher die Ausgabe des Generators tanh ein.

Latent Distribution Machen Sie die vorherige Verteilung latenter Variablen zu einer Normalverteilung mit einer sphärischen Verteilung anstelle einer gleichmäßigen Verteilung mit einer rechteckigen Verteilung.

dcgan_training.py


z_data = np.ascontiguousarray(np.random.normal(size=(minibatch_size, z_dim)), dtype="float32")

Network Architecture Da ich mich diesmal mit Bildern befasst habe, habe ich DCGAN übernommen, das eine Faltschicht verwendet.

Stellen Sie den Anfangswert des Faltungsschichtgewichts auf eine Normalverteilung mit einer Varianz von 0,02 ein.

Stellen Sie für das Downsampling den Schritt der durchschnittlichen Pooling- oder Faltungsschicht auf 2 ein. Setzen Sie für das Upsampling den Schritt von Pixel Shuffle [7] oder die Translokationsfaltungsschicht auf 2.

Die Chargennormalisierung funktionierte nur, wenn sowohl Diskriminator als auch Generator vor der Aktivierungsfunktion angewendet wurden. Die Chargennormalisierung stabilisiert das Training, mischt jedoch keine echten und gefälschten Daten.

In dem implementierten Programm werden nur gefälschte Daten als Eingabe empfangen, während die Parameter von Discriminator an den folgenden Stellen gemeinsam genutzt werden.

dcgan_training.py


D_fake = D_real.clone(method="share", substitutions={x_real.output: G_fake.output})

ReLU hat ein Problem namens Deadly Neuron, bei dem Leaky ReLU anstelle von ReLU verwendet wird, um die daraus resultierende Gradientenschwäche zu vermeiden. ELU [6] funktioniert jedoch möglicherweise nicht.

Loss Function Die Verlustfunktion des ursprünglichen GAN [4] ist wie folgt.

\max_{D} \mathbb{E}_{x \sim p_r(x)} [\log D(x)] + \mathbb{E}_{z \sim p_z(z)} [\log(1 - D(G(z))]\\
\min_{G} \mathbb{E}_{z \sim p_z(z)} [\log(1 - D(G(z)))]

In der obigen Gleichung ist die Verlustfunktion des Diskriminators jedoch eine Kreuzentropie, und wenn das Lernen des Diskriminators zu weit geht, verschwindet der Gradient des Generators, so dass die Verlustfunktion des Generators vom Minimierungsproblem zum Maximierungsproblem geändert wird. Machen.

\max_{G} \mathbb{E}_{z \sim p_z(z)} [\log D(G(z))]

Das heißt, wenn das Training gut verläuft, scheint es keinen Unterschied in den Ergebnissen beider Verlustfunktionen zu geben.

Optimizer Adam ist die beste Wahl für den Optimierungsalgorithmus. Stellen Sie den Impuls jedoch auf einen kleinen Wert von ungefähr 0,5 und die Lernrate auf einen kleinen Wert von ungefähr 1e-4 ein.

Dieses Mal habe ich die zyklische Lernrate [8] wegen der Instabilität des Trainings nicht verwendet.

Training Es ist schwierig, das Training von Diskriminator und Generator statistisch zu kontrollieren. Vermeiden Sie es daher so weit wie möglich.

Wenn Sie es wirklich kontrollieren möchten, trainieren Sie Discriminator häufiger.

Ergebnis

Diskriminator- und Generatorverlustfunktionen

Die folgende Abbildung zeigt eine Visualisierung jeder Verlustfunktion während des Trainings. Die horizontale Achse repräsentiert die Anzahl der Wiederholungen und die vertikale Achse repräsentiert den Wert der Verlustfunktion.

dcgan_logging.png

Generierte Bilder und Übergänge während des Trainings

Die folgende Abbildung zeigt das vom trainierten Generator erzeugte Gesichtsbild. Ich habe den Eindruck, dass es viele ähnliche Bilder gibt. Dies deutet darauf hin, dass ein Moduskollaps auftritt und ein schlechter Trend ist.

dcgan_image.png

Die folgende Abbildung zeigt den Übergang der Bilderzeugung während des Trainings mit Animation. Ich versuche mein Bestes, um ein Gesicht zu erzeugen, aber es ist schwer zu sagen, dass es funktioniert.

dcgan.gif

Quantitative Bewertung anhand des Inception Score

Die quantitative Bewertung von GAN ist ein schwieriges Problem, aber der Inception Score [9] wurde als einer der Bewertungsindizes vorgeschlagen.

Der Inception Score gilt für geschulte Generatoren

-Bildqualität: Ist es möglich, ein bestimmtes Bild zu erzeugen? -Bildvielfalt: Gibt es eine Variation im generierten Bild (gibt es einen Moduskollaps?)

Messen. Ich habe Inception-v3 [10] als Basismodell für die Messung des Inception Score verwendet. Das Ergebnis ist wie folgt.

Inception Score 2.61

Referenz

CNTK 206: Part B - Deep Convolutional GAN with MNIST data How to Implement the Inception Score (IS) for Evaluating GANs

GAN : DCGAN Part1 - Scraping Web images

  1. Alec Radford, Luke Metz, and Soumith Chintal. "Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks", arXiv preprint arXiv:1511.06434 (2015).
  2. Ioffe Sergey and Christian Szegedy. "Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift", arXiv preprint arXiv:1502.03167 (2015).
  3. Andrew L. Maas, Awni Y. Hannun, and Andrew Y. Ng. "Rectifier Nonlinearities Improve Neural Network Acoustic Models", Proc. icml. Vol. 30. No. 1. 2013.
  4. Ian J. Goodfellow, Jean Pouget-Abadie, Mehdi Mira, Bing Xu, David Warde-Farley, Sherjil Ozair, Aaron Courville, and Yoshua Bengio. "Generative Adversarial Nets", Advances in neural information processing systems. 2014, pp 2672-2680.
  5. Diederik P. Kingma and Jimmy Lei Ba. "Adam: A method for stochastic optimization", arXiv preprint arXiv:1412.6980 (2014).
  6. Djork-Arné Clevert, Thomas Unterthiner, and Sepp Hochreiter. "Fast and accurate deep network learning by exponential linear units (ELUs)." arXiv preprint arXiv:1511.07289 (2015).
  7. Wenzhe Shi, Jose Cabellero, Ferenc Huszar, Johannes Totz, Andrew P. Aitken, Rob Bishop, Daniel Rueckert, and Zehan Wang. "Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network", The IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2016, pp 1874-1883.
  8. Leslie N. Smith. "Cyclical Learning Rates for Training Neural Networks", 2017 IEEE Winter Conference on Applications of Computer Vision. 2017, pp 464-472.
  9. Tim Salimans, Ian Goodfellow, Wojciech Zaremba, Vicki Cheung, Alec Radford, and Xi Chen, "Improved Techniques for Training GANs", Neural Information Processing Systems. 2016. pp 2234-2242.
  10. Christian Szegedy, Vincent Vanhoucke, Sergey Ioffe, Jon Shlens, and Zbigniew Wojna. "Rethinking the Inception Architecture for Computer Vision", The IEEE Conference on Computer Vision and Pattern Recognition (CVPR). 2016, pp 2818-2826.

Recommended Posts

GAN: DCGAN Part2-Training DCGAN-Modell
GAN: DCGAN Part1 - Webbilder abkratzen
DCGAN