我想在Keras训练一个GAN . 我的最终目标是BEGAN,但我从最简单的目标开始 . 在这里需要了解如何正确地冻结重量,并且正在努力解决这个问题 .
在发电机训练时间期间,可能不会更新鉴别器权重 . 我想交替冻结和解冻鉴别器,交替训练发生器和鉴别器 . 问题是在鉴别器模型上甚至在其停止模型上训练可训练参数为假(以及更新权重) . 另一方面,当我将trainable设置为False后编译模型时,权重变得不可解体 . 我无法在每次迭代后编译模型,因为这会否定整个训练的想法 .
由于这个问题,许多Keras实现似乎被窃听或者它们起作用,因为在旧版本或某些东西中有一些非直观的技巧 .
3 回答
也许你的对抗网(生成器加鉴别器)是在'Model'中写的 . 但是,即使你设置 d.trainable=False ,独立的d网也设置为不可训练,但整个对抗网中的d仍然是可训练的 .
你可以在设置 d.trainable=False 之前使用d_on_g.summary(),你会知道我的意思(注意可训练的变量) .
你能用
tf.stop_gradient
有条件地冻结重量吗?我几个月前尝试过这个示例代码并且它有效: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()
.