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.
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.
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 |
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.
・ 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
Das Schulungsprogramm ist auf [GitHub] verfügbar (https://github.com/sho-watari/GAN/tree/master/DCGAN).
dcgan_training.py
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.
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.
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.
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.
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
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