Python 3.x 在GAN中,是否需要编译生成器

Python 3.x 在GAN中,是否需要编译生成器,python-3.x,tensorflow,keras,deep-learning,generative-adversarial-network,Python 3.x,Tensorflow,Keras,Deep Learning,Generative Adversarial Network,我一直在研究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(Lea

我一直在研究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训练期间被冻结,因此只有生成器得到训练。那么,为什么在培训期间编译生成器,生成器和鉴别器的目标是相反的:
鉴别器
尝试区分假图像和真图像,而 生成器试图生成看起来足够真实的图像来欺骗用户 鉴别器。
由于GAN由两个目标不同的网络组成,因此无法像常规神经网络那样进行训练。 每个培训迭代分为两个阶段:

  • 在第一阶段,我们训练鉴别器。一批真正的 图像从训练集中采样,并使用 生成器生成的相同数量的假图像。标签是 假图像设置为0,真图像设置为1,鉴别器 使用二进制代码对该标记批次进行一步培训 交叉熵损失。重要的是,反向传播只会优化 此阶段中鉴别器的权重
  • 在第二阶段,我们训练发电机。我们首先用它来 制作另一批假图像,再次 鉴别器用来辨别图像是真是假。 这一次,我们不在批处理中添加真实图像,也不添加所有标签 设置为1(实):换句话说,我们希望生成器生成 鉴别器(错误地)认为是真实的图像! 关键的是,在此期间,
    鉴别器的权重被
    冻结
    步骤,因此反向传播仅影响生成器的权重
接下来,我们需要编译这些模型。这个
生成器
将仅通过
gan模型
进行培训,因此我们无需 完全编译它。重要的是,
鉴别器
不应 在第二阶段进行培训,因此我们在之前将其设置为不可培训

编译
gan模型:

确实不需要编译
G
。您只需在
D
培训期间使用
generator.predict()
D
提供假样本即可。确保在更新过程中,
D
权重被冻结。谢谢@Slowpoke的回答,你知道其他人编译生成器的可能原因吗,即使我们不需要它。