【问题标题】:How to dynamically freeze weights after compiling model in Keras?在 Keras 中编译模型后如何动态冻结权重?
【发布时间】:2017-12-22 13:52:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: python tensorflow neural-network keras theano


    【解决方案1】:

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

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

    您无需打开/关闭鉴别器的可训练属性并重新编译。只需创建和编译两个模型对象,一个带有trainable=True(代码中的discriminator),另一个带有trainable=False(代码中的combined)。

    当您更新鉴别器时,请致电discriminator.train_on_batch()。更新生成器时,请致电combined.train_on_batch()

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • tf.stop_gradient 正在停止渐变流动,这不是我想要实现的。我想让梯度流动并计算权重梯度,但不执行更新操作。
      • 那么您最好将要更新的变量列表显式传递给 tensorflow 更新操作,而不是一直冻结/解冻权重。
      • 你是对的,但它是 Tensorflow 解决方案,Keras 不允许这样做。你有一个模型抽象,你主要有fittrain_on_batch 方法,仅此而已。如果纯 Keras 没有解决方案,那么我将切换到 Tensorflow。
      【解决方案3】:

      也许你的对抗网络(生成器加鉴别器)写在“模型”中。 然而,即使你设置了 d.trainable=False,独立的 d 网络被设置为不可训练的,但整个对抗网络中的 d 仍然是可训练的。

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

      【讨论】:

        猜你喜欢
        • 2020-01-03
        • 1970-01-01
        • 1970-01-01
        • 2020-07-13
        • 2017-06-21
        • 1970-01-01
        • 2021-08-30
        • 2022-01-19
        • 1970-01-01
        相关资源
        最近更新 更多