Keras 我是否必须每批重新编译我的Gan,以防止鉴别器学习?

Keras 我是否必须每批重新编译我的Gan,以防止鉴别器学习?,keras,generative-adversarial-network,Keras,Generative Adversarial Network,我有一只这样的鹅 generator = Model(g_in, g_out) generator.compile(...) discriminator = Model(d_in, d_out) discriminator.trainable = True discriminator.compile(..) discriminator.trainable = False gan = Model(inputs=.., outputs=..) gan.compile(..) #iterate

我有一只这样的鹅

generator = Model(g_in, g_out)
generator.compile(...)

discriminator = Model(d_in, d_out)
discriminator.trainable = True
discriminator.compile(..)

discriminator.trainable = False

gan = Model(inputs=.., outputs=..)
gan.compile(..)

#iterate over epochs and batches, without compiling
它学习并给出可接受的输出。然而,我得到了警告:

“keras\engine\training.py:490:UserWarning:可训练重量和收集的可训练重量之间存在差异,您是否设置了
model.trainiable
,而未调用
model.compile
? “可训练重量和收集的可训练重量之间的差异”

如果我重新编译鉴别器并对每一批进行扫描,警告就会消失,但一次迭代需要更长的时间,而且训练速度较慢

for epoch:
  for batch:

    fakes=generator.predict_on_batch(batch)

    discriminator.trainable = True
    discriminator.compile(..)

    discriminator.train_on_batch(batch, ..)
    discriminator.train_on_batch(fakes, ..)

    discriminator.trainable = False
    discriminator.compile(..)
    gan.compile(..)

    gan.train_on_batch(batch,..)

哪一个是正确的?

这是预期的,不需要重新编译每个批次。Keras对此有一个公开的bug:

那里的回复中有一些如何绕过警告的例子,我不打算在这里重复。还有一个回复,提供了很好的建议,如果您对模型的细节不确定,如何验证您是否真的在培训您应该培训的内容: