我在Keras实施了一个生成式对抗网络。我的训练数据大小约为16,000,其中每个图像的大小均为32 * 32。我所有的训练图像都是关于对象检测任务的imagenet数据集中的图像的调整大小版本。我将图像矩阵直接馈入网络,而没有进行中心裁剪。我使用的AdamOptimizer的学习率为1e-4,beta1为0.5,并且还将辍学率设置为0.1。我首先在3000个真实图像和3000个伪图像上训练了判别器,它的准确率达到了93%。然后,我训练了500个纪元,批处理大小为32。但是,我的模型似乎只收敛了几个纪元(
Plot of the Loss Function

Random Samples Generated by the Generator

我想知道我的训练数据集是否太小(与DCGAN论文中的数据集相比(300,000多个))或我的模型配置不正确。更重要的是,我是否应该按照Ian Goodfellow在原始论文中的建议,在D上对SGD进行k次迭代训练(其中k小,可能为1),然后在G上对SGD进行一次迭代训练(我刚刚尝试对它们进行训练)一次一个)

以下是生成器的配置。

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

最佳答案

我怀疑您在训练gan时发电机是可训练的。您可以使用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

07-24 09:52