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