首页 文章

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

提问于
浏览
2

我想在Keras训练一个GAN . 我的最终目标是BEGAN,但我从最简单的目标开始 . 在这里需要了解如何正确地冻结重量,并且正在努力解决这个问题 .

在发电机训练时间期间,可能不会更新鉴别器权重 . 我想交替冻结和解冻鉴别器,交替训练发生器和鉴别器 . 问题是在鉴别器模型上甚至在其停止模型上训练可训练参数为假(以及更新权重) . 另一方面,当我将trainable设置为False后编译模型时,权重变得不可解体 . 我无法在每次迭代后编译模型,因为这会否定整个训练的想法 .

由于这个问题,许多Keras实现似乎被窃听或者它们起作用,因为在旧版本或某些东西中有一些非直观的技巧 .

3 回答

  • 0

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

    你可以在设置 d.trainable=False 之前使用d_on_g.summary(),你会知道我的意思(注意可训练的变量) .

  • 0

    你能用 tf.stop_gradient 有条件地冻结重量吗?

  • 4

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

    它不是最简单的GAN形式,但据我记忆,删除分类丢失并将模型转换为GAN并不太难 .

    你没有't need to turn on/off the discriminator'的可训练 property 并重新编译 . 只需创建和编译两个模型对象,一个用 trainable=True (代码中为 discriminator ),另一个用 trainable=False (代码中为 combined ) .

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

相关问题