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

Do I have to recompile my Gan every batch, to prevent the discriminator from learning?

我有这样的甘

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: 用户警告:可训练权重与收集的可训练权重之间存在差异,您是否设置了 model.trainable 而没有在之后调用 model.compile? 'Discrepancy between trainable weights and collected trainable'"

如果我每批重新编译判别器和 gan,警告消失,但一次迭代需要更长的时间并且训练速度更慢。

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 有一个关于此的公开错误:https://github.com/keras-team/keras/issues/8585

里面的回复都有一些绕过警告的例子,这里就不重复了。如果您不确定模型的具体细节,还有一个回复提供了很好的建议,说明如何验证您是否真的在训练您应该训练的内容:https://github.com/keras-team/keras/issues/8585#issuecomment-385729276