2017-01-26 10 views
2

私はKerasで遺伝的反対ネットワークを実装しました。トレーニングデータのサイズは約16,000で、各画像は32×32サイズです。私のトレーニング画像はすべて、オブジェクト検出タスクに関するimagenetデータセットからのイメージングのサイズ変更されたバージョンです。私は中央の作物を使わずに、画像マトリックスを直接ネットワークに送りました。 AdamOptimizerを学習率1e-4、ベータ1を0.5、ドロップアウト率を0.1に設定しました。私はまず3000人の実画像と3000人の偽の画像で弁別器を訓練し、93%の精度を達成しました。そして、私はバッチサイズが32の500エポックを訓練しました。しかし、私のモデルはほんの数エポック(< 10)に収束していて、それが生成した画像は醜いものでした。GANはほんのわずかなエポックで収束します

Plot of the Loss Function

Random Samples Generated by the Generator

私は(30万以上であるDCGANの紙のもの、と比較して)私のトレーニングデータセットが小さすぎるかどうかを疑問に思ったか、私のモデル構成が正しくありません。さらに、Ian Goodfellowが元の論文で提案したように、k回の繰り返し(kが小さい、おそらく1)でSGDをD上でトレーニングし、次にGでSGDを訓練する必要がありますか(私はそれらを訓練しようとしました1つずつ)

以下は、ジェネレータの構成です。以下は

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() 

弁別器の構成です:

以下
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() 

は全体としてGANの設定です:

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() 

答えて

0

私はあなたが訓練している間、あなたの発電機が学習可能であることを疑いますガン。あなたはgenerator.layers[-1].get_weights()を使って、ganのトレーニングプロセス中にパラメータが変更されたかどうかを確認することができます。

あなたはGaNとそれを組み立てる前に、弁別を凍結する必要があります。

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() 

はこの議論を参照してください。 https://github.com/fchollet/keras/issues/4674

関連する問題