在 Keras 中编译模型后如何动态冻结权重?
How to dynamically freeze weights after compiling model in Keras?
我想在 Keras 中训练 GAN。我的最终目标是 BEGAN,但我从最简单的开始。了解如何正确冻结权重在这里是必要的,这就是我正在努力解决的问题。
在生成器训练期间,鉴别器权重可能不会更新。我想交替 freeze 和 unfreeze 鉴别器来交替训练生成器和鉴别器。问题是在 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() 然后你会明白我的意思(注意可训练的变量)。
我想在 Keras 中训练 GAN。我的最终目标是 BEGAN,但我从最简单的开始。了解如何正确冻结权重在这里是必要的,这就是我正在努力解决的问题。
在生成器训练期间,鉴别器权重可能不会更新。我想交替 freeze 和 unfreeze 鉴别器来交替训练生成器和鉴别器。问题是在 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() 然后你会明白我的意思(注意可训练的变量)。