2017-11-16 1 views
0

Vor kurzem studiere ich das GAN-Netzwerk, ich benutze es, um ein Mnisit Bild zu generieren, die Umgebung in meinem Computer ist Ubuntu16.04, Tensorflow, Python3.Verwenden Sie GAN zu Generator Mnist, aber studieren nichts

Der Code kann ohne jeden Fehler ausgeführt werden. Aber das Ergebnis zeigt die Netzwerkstudie nichts, durch Training ist das Ausgangsbild noch Bild laut.

Zuerst entwerfe ich ein Generator-Netzwerk: Der Eingang ist verrauschte Daten der 784-Dimension, durch eine verborgene Schicht und Regel, generieren Sie ein Bild der 784-Dimension.

Dann entwerfe ich ein Diskriminator-Netzwerk: Die Eingabe ist echtes Bild und gefälschtes Bild, durch eine versteckte Ebene und Regel, die Ausgabe ist Logiken 1 Dimension.

Dann habe ich die generator_loss und discinator_loss definiert, dann Generator und Diskriminator trainieren.Es kann laufen, aber das Ergebnis zeigt die Netzwerkstudie nichts, der Verlust kann Konvergenz nicht.

import tensorflow as tf 
import numpy as np 
import tensorflow.contrib.slim as slim 
import matplotlib.pyplot as plt 
from tensorflow.examples.tutorials.mnist import input_data 

mnist = input_data.read_data_sets("/home/zyw/data/tensor_mnist-master/MNIST_data/",one_hot=True) 
batch_size = 100 

G_in = tf.placeholder(tf.float32,[None,784]) 
G_h1 = tf.layers.dense(G_in, 128) 
G_h1 = tf.maximum(0.01 * G_h1, G_h1) 
G_out = tf.tanh(tf.layers.dense(G_h1, 784)) 

real = tf.placeholder(tf.float32,[None,784]) 
Dl0 = tf.layers.dense(G_out, 128) 
Dl0 = tf.maximum(0.01 * Dl0, Dl0) 
p0 = tf.layers.dense(Dl0, 1) 

Dl1 = tf.layers.dense(real, 128) 
Dl1 = tf.maximum(0.01 * Dl1, Dl1) 
p1 = tf.layers.dense(Dl1, 1) 

G_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits =p0,labels=tf.ones_like(p0)*0.9)) 
D_real_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits =p1,labels=tf.ones_like(p1)*0.9)) 
D_fake_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits =p0,labels=tf.zeros_like(p0))) 
D_total_loss = tf.add(D_fake_loss,D_real_loss) 

G_train = tf.train.AdamOptimizer(0.01).minimize(G_loss) 
D_train = tf.train.AdamOptimizer(0.01).minimize(D_total_loss) 

init = tf.global_variables_initializer() 

with tf.Session() as sess: 
    sess.run(init) 

    for i in range(1000): 
     mnist_data,_ = mnist.train.next_batch(batch_size) 

     # noise_org = tf.random_normal([batch_size,784],stddev = 0.1,dtype = tf.float32) 
     noise_org = np.random.randn(batch_size, 784) 
     a,b,dloss= sess.run([D_real_loss,D_fake_loss,D_total_loss,G_train,D_train],feed_dict={G_in:noise_org,real:mnist_data})[:3] 
     if i%100==0: 
      print(a,b,dloss) 
    #test_generative_image 
    noise_org = np.random.randn(1, 784) 
    image = sess.run(G_out,feed_dict ={G_in:noise_org}) 
    outimage = tf.reshape(image, [28,28]) 
    plt.imshow(outimage.eval(),cmap='gray') 
    plt.show() 
    print('ok') 

das Ergebnis:

0.80509 0.63548 1.44057 
0.33512 0.20223 0.53735 
0.332536 0.97737 1.30991 
0.328048 0.814452 1.1425 
0.326688 0.411907 0.738596 
0.325864 0.570807 0.896671 
0.325575 0.970406 1.29598 
0.325421 1.02487 1.35029 
0.325222 1.34089 1.66612 
0.325217 0.747129 1.07235 
+0

Bitte stellen Sie Ihre Frage klarer.als es geschrieben ist es schrecklich zu lesen.Sie haben wirklich nicht 5 Sekunden zu Leerzeichen oder neue Zeilen zu ersetzen, oder Satzzeichen zu korrigieren, Gosh das ist schmerzhaft – Julien

+0

das ist mein erstes Zeit stackoverflow zu verwenden, um eine Frage zu stellen und mein Englisch in nicht gut, danke für Ihre Erinnerung, ich werde es korrigieren. – zyw

Antwort

0

Ich habe den geänderten Code mit den Kommentaren hinzugefügt, wo ich die Änderungen vorgenommen. Außerdem habe ich unten meine Änderungen beschrieben.

import tensorflow as tf 
import numpy as np 
import tensorflow.contrib.slim as slim 
import matplotlib.pyplot as plt 
from tensorflow.examples.tutorials.mnist import input_data 

mnist = input_data.read_data_sets("/home/zyw/data/tensor_mnist-master/MNIST_data/",one_hot=True) 

batch_size = 100 

#define the generator function 
def generator(input): 
    G_h1 = tf.layers.dense(input, 128) 
    # G_h1 = tf.maximum(0.01 * G_h1, G_h1) 
    G_out = tf.sigmoid(tf.layers.dense(G_h1, 784)) # sigmoid function added 
    return G_out 

#Define the discrminator function 
def discriminator(input): 
    Dl0 = tf.layers.dense(input, 128) 
    # Dl0 = tf.maximum(0.01 * Dl0, Dl0) 
    p0 = tf.layers.dense(Dl0, 1) 
    return p0 

#Generator 
with tf.variable_scope('G'): 
    G_in = tf.placeholder(tf.float32, [None, 784]) 
    G_out = generator(G_in) 

real = tf.placeholder(tf.float32, [None, 784]) 

#Discrimnator that takes the real data 
with tf.variable_scope('D'): 
    D1 = discriminator(real) 

#Discriminator that takes fake data 
with tf.variable_scope('D', reuse=True): # need to use the same copy of Discrminator 
    D2 = discriminator(G_out) 

G_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D2, labels=tf.ones_like(D2))) 
D_real_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D1, labels=tf.ones_like(D1))) 
D_fake_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D2, labels=tf.zeros_like(D2))) 
D_total_loss = tf.add(D_fake_loss, D_real_loss) 

vars = tf.trainable_variables() #all trainable variables 
d_training_vars = [v for v in vars if v.name.startswith('D/')] # varibles associated with the discrminator 
g_training_vars = [v for v in vars if v.name.startswith('G/')] # varibles associated with the generator 

G_train = tf.train.AdamOptimizer(0.001).minimize(G_loss,var_list=g_training_vars) # only train the variables associated with the generator 
D_train = tf.train.AdamOptimizer(0.001).minimize(D_total_loss,var_list=d_training_vars) # only train the variables associated with the discriminator 

init = tf.global_variables_initializer() 

with tf.Session() as sess: 
    sess.run(init) 

    for i in range(1000): 
     mnist_data, _ = mnist.train.next_batch(batch_size) 
     # noise_org = tf.random_normal([batch_size,784],stddev = 0.1,dtype = tf.float32) 
     noise_org = np.random.randn(batch_size, 784) 

     a, b, dloss = sess.run([D_real_loss, D_fake_loss, D_total_loss, G_train, D_train],feed_dict={G_in: noise_org, real: mnist_data})[:3] 
     if i % 100 == 0: 
      print(a, b, dloss) 

    # test_generative_image 
    noise_org = np.random.randn(1, 784) 
    image = sess.run(G_out, feed_dict={G_in: noise_org}) 
    outimage = tf.reshape(image, [28, 28]) 

    plt.imshow(outimage.eval(), cmap='gray') 
    plt.show() 
    print('ok') 

Ein paar Punkte, die Sie beachten sollten, wenn ein GAN Implementierung

  1. benötigen die gleichen Kopien des Entscheiders zu verwenden (dh Aktien gleiche Gewichte), wenn die Unterscheidungs ​​Verlust der Umsetzung (in Ihr Fall Dl0 und Dl1 sollten die gleichen Paramenten teilen).
  2. Generator Aktivierungsfunktion sollte sigmoid nicht tanh da der Ausgang des Generators sein sollte nur zwischen 0 und 1. (seit seiner einem Bild) Variieren werden
  3. Wenn die Ausbildung Diskriminator, sollten Sie nur die Variablen trainieren, die mit dem Diskriminator verbunden sind. Ebenso sollten Sie beim Training des Generators nur die Variablen trainieren, die mit dem Generator verbunden sind.

  4. Manchmal ist es wichtig, darauf zu achten, dass der Scheidungs ​​ ist mächtiger als der Generator, da sonst wäre es nicht ausreichende Kapazität zu lernen, um zu unterscheiden, genau zwischen erzeugt und Echt Proben.

Dies sind nur die grundlegenden Dinge des GAN s, die Sie beachten sollten.Es gibt jedoch viele andere Aspekte, die Sie bei der Entwicklung eines GAN berücksichtigen sollten. Sie können eine gute Grundidee von GAN s erhalten, indem Sie folgende zwei Artikel lesen.

  1. http://blog.aylien.com/introduction-generative-adversarial-networks-code-tensorflow/
  2. http://blog.evjang.com/2016/06/generative-adversarial-nets-in.html

Hoffnung, das hilft.

+0

Danke! Ich ändere mein Netzwerk nach Ihrem Rat und es funktioniert, die 4 Punkte sind sehr nützlich für mich, danke für Ihre Antwort noch einmal. Ich werde die zwei Artikel lesen. – zyw

Verwandte Themen