2017-01-26 3 views
2

Ich habe in Keras ein generatives adversariales Netzwerk implementiert. Meine Trainingsdatengröße beträgt etwa 16.000, wobei jedes Bild die Größe 32 * 32 hat. Alle meine Trainingsbilder sind die in der Größe angepassten Versionen der Bilddaten aus dem Bilddaten-Datensatz in Bezug auf die Objekterkennungsaufgabe. Ich fütterte die Bildmatrix direkt in das Netzwerk, ohne die zentrale Ernte zu machen. Ich benutzte den AdamOptimizer mit der Lernrate von 1e-4 und Beta1 von 0,5 und ich setzte die Dropout-Rate ebenfalls auf 0,1. Ich habe den Diskriminator zuerst auf 3000 echten Bildern und 3000 falschen Bildern trainiert und dabei eine Genauigkeit von 93% erreicht. Dann trainierte ich für 500 Epochen mit der Losgröße 32. Mein Modell schien jedoch nur in wenigen Epochen zu konvergieren (< 10), und die Bilder, die es erzeugte, waren hässlich.GAN konvergiert in nur wenigen Epochen

Plot of the Loss Function

Random Samples Generated by the Generator

Ich frage mich, ob meine Trainingsdatenmenge zu klein ist (im Vergleich zu denen in dem Papier von DCGAN, die mehr als 300.000 sind) oder meine Modellkonfiguration ist nicht korrekt. Außerdem, sollte ich die SGD auf D für k Iterationen trainieren (wobei k klein ist, vielleicht 1) und dann mit SGD auf G für eine Iteration trainieren, wie es Ian Goodfellow in der Originalarbeit vorgeschlagen hat (ich habe gerade versucht, sie zu trainieren) (einzeln)

Unten ist die Konfiguration des Generators.

g_input = Input(shape=[100]) 
H = Dense(1024*4*4, init='glorot_normal')(g_input) 
H = BatchNormalization(mode=2)(H) 
H = Activation('relu')(H) 
H = Reshape([4, 4,1024])(H) 
H = UpSampling2D(size=(2, 2))(H) 
H = Convolution2D(512, 3, 3, border_mode='same', init='glorot_uniform')(H) 
H = BatchNormalization(mode=2)(H) 
H = Activation('relu')(H) 
H = UpSampling2D(size=(2, 2))(H) 
H = Convolution2D(256, 3, 3, border_mode='same', init='glorot_uniform')(H) 
H = BatchNormalization(mode=2)(H) 
H = Activation('relu')(H) 
H = UpSampling2D(size=(2, 2))(H) 
H = Convolution2D(3, 3, 3, border_mode='same', init='glorot_uniform')(H) 
g_V = Activation('tanh')(H) 
generator = Model(g_input,g_V) 
generator.compile(loss='binary_crossentropy', optimizer=opt) 
generator.summary() 

Unten finden Sie die Konfiguration des Entscheiders:

d_input = Input(shape=shp) 
H = Convolution2D(64, 5, 5, subsample=(2, 2), border_mode = 'same', init='glorot_normal')(d_input) 
H = LeakyReLU(0.2)(H) 
#H = Dropout(dropout_rate)(H) 
H = Convolution2D(128, 5, 5, subsample=(2, 2), border_mode = 'same', init='glorot_normal')(H) 
H = BatchNormalization(mode=2)(H) 
H = LeakyReLU(0.2)(H) 
#H = Dropout(dropout_rate)(H) 
H = Flatten()(H) 
H = Dense(256, init='glorot_normal')(H) 
H = LeakyReLU(0.2)(H) 
d_V = Dense(2,activation='softmax')(H) 
discriminator = Model(d_input,d_V) 
discriminator.compile(loss='categorical_crossentropy', optimizer=dopt) 
discriminator.summary() 

Im Folgenden ist die Konfiguration von GAN als Ganzes:

gan_input = Input(shape=[100]) 
H = generator(gan_input) 
gan_V = discriminator(H) 
GAN = Model(gan_input, gan_V) 
GAN.compile(loss='categorical_crossentropy', optimizer=opt) 
GAN.summary() 

Antwort

0

Ich vermute, dass Ihr Generator trainierbar ist, während Sie die Ausbildung Gan. Sie können überprüfen, indem Sie generator.layers[-1].get_weights() verwenden, um zu sehen, ob sich die Parameter während des Trainings von gan geändert haben.

Sie sollten Scheider einfrieren, bevor Sie es gan montieren:

generator.trainnable = False 
gan_input = Input(shape=[100]) 
H = generator(gan_input) 
gan_V = discriminator(H) 
GAN = Model(gan_input, gan_V) 
GAN.compile(loss='categorical_crossentropy', optimizer=opt) 
GAN.summary() 

diese Diskussion siehe: https://github.com/fchollet/keras/issues/4674

Verwandte Themen