在 Keras 中编译模型后如何动态冻结权重?

How to dynamically freeze weights after compiling model in Keras?

我想在 Keras 中训练 GAN。我的最终目标是 BEGAN,但我从最简单的开始。了解如何正确冻结权重在这里是必要的,这就是我正在努力解决的问题。

在生成器训练期间,鉴别器权重可能不会更新。我想交替 freezeunfreeze 鉴别器来交替训练生成器和鉴别器。问题是在 discriminator 模型上或什至在其权重上将 trainable 参数设置为 false 不会停止模型训练(以及权重更新).另一方面,当我在将 trainable 设置为 False 后编译模型时,权重变为 unfreezable。我无法在每次迭代后编译模型,因为这否定了整个训练的想法。

由于这个问题,似乎许多 Keras 实现都存在错误,或者由于旧版本中的一些非直观技巧或其他原因,它们可以正常工作。

可以使用tf.stop_gradient有条件地冻结权重吗?

几个月前我试过这个示例代码并且它有效: https://github.com/fchollet/keras/blob/master/examples/mnist_acgan.py

这不是最简单的 GAN 形式,但据我所知,去除分类损失并将模型变成 GAN 并不太难。

您不需要将 on/off 鉴别器的可训练 属性 转为 属性 并重新编译。只需创建并编译两个模型对象,一个带有 trainable=True(代码中的 discriminator),另一个带有 trainable=False(代码中的 combined)。

更新鉴别器时,请调用 discriminator.train_on_batch()。更新生成器时,请调用 combined.train_on_batch().

可能你的对抗网络(生成器加判别器)写在了'Model'中。 然而,即使你设置了d.trainable=False,独立的d网络被设置为不可训练的,但是整个对抗网络中的d仍然是可训练的。

你可以在设置 d.trainable=False 之前使用 d_on_g.summary() 然后你会明白我的意思(注意可训练的变量)。