【发布时间】:2020-09-29 21:17:37
【问题描述】:
我一直在研究 GAN,让我摸不着头脑的是为什么我们必须编译生成器模型,即使我们编译组合的 GAN 模型,为什么还要单独编译生成器。
def create_generator():
generator = Sequential()
generator.add(Dense(256, input_dim=noise_dim))
generator.add(LeakyReLU(0.2))
generator.add(Dense(512))
generator.add(LeakyReLU(0.2))
generator.add(Dense(1024))
generator.add(LeakyReLU(0.2))
generator.add(Dense(img_rows*img_cols*channels, activation='tanh'))
generator.compile(loss='binary_crossentropy', optimizer=optimizer)
return generator
def create_descriminator():
discriminator = Sequential()
discriminator.add(Dense(1024, input_dim=img_rows*img_cols*channels))
discriminator.add(LeakyReLU(0.2))
discriminator.add(Dense(512))
discriminator.add(LeakyReLU(0.2))
discriminator.add(Dense(256))
discriminator.add(LeakyReLU(0.2))
discriminator.add(Dense(1, activation='sigmoid'))
discriminator.compile(loss='binary_crossentropy', optimizer=optimizer)
return discriminator
discriminator = create_descriminator()
generator = create_generator()
# Make the discriminator untrainable when we are training the generator. This doesn't effect the discriminator by itself
discriminator.trainable = False
# Link the two models to create the GAN
gan_input = Input(shape=(noise_dim,))
fake_image = generator(gan_input)
gan_output = discriminator(fake_image)
gan = Model(gan_input, gan_output)
gan.compile(loss='binary_crossentropy', optimizer=optimizer)
在这段代码中,我们可以看到生成器、判别器和 gan(组合模型)这三个都被编译了。根据我的理解,我们应该只编译鉴别器(训练鉴别器)和 gan(组合模型,训练生成器),因为鉴别器的权重在 GAN 训练期间被冻结,结果只有生成器得到训练。那为什么要编译生成器
【问题讨论】:
-
确实不需要编译
G。在D训练期间,您只需使用generator.predict()为D提供假样本。确保在gan更新期间冻结了D权重。 -
感谢@Slowpoke 的回答,您知道其他人编译生成器的任何可能原因吗,即使我们不需要它。
-
@IrfanDanish 如果你不编译生成器,你会收到来自 TensorFlow 的大量警告。这可能只是摆脱这些警告的一种方式。
标签: python-3.x tensorflow keras deep-learning generative-adversarial-network