在Keras中训练GAN时,是否需要多次通过才能优化生成器和鉴别器?

时间:2019-07-09 23:37:00

标签: python tensorflow keras

我比Keras更熟悉张量流图训练,但是我在这里尝试Keras。

在构建GAN时,需要优化发电机,使其免受与鉴别器不同的损耗(相反的损耗)的影响。在基本张量流中,使用两个优化器或通过分别调用具有适当权重的optimizer.compute_gradients(...)optimizer.apply_gradients(...)即可轻松实现。

在Keras中,我看不到我可以实现这两个目标。在诸如Keras-GAN之类的实现中,似乎将生成器和鉴别器的训练划分为单独的模型,然后逐个批次地进行独立训练。这意味着每次有效更新所需的遍数要比使用两个优化器一次运行的基本张量流实现所需的遍数更多。

是否有一种方法可以为GAN实现优化器,从而使生成器和鉴别器都可以在Keras中一次通过训练?

TF 1.14

1 个答案:

答案 0 :(得分:1)

对于Keras来说,这是一个非常棘手的问题,原因如下:

  1. 一个模型只能有一个优化器...有必要更改其源代码以使其接受两个或多个

  2. 即使使用自定义优化器,也可以分离权重,但是它不能提供分离损失的支持,如source code for optimizers所示。

  3. 可能性是优化器已经计算出最终的常见损失(这样就不可能将一组损失归因于一组权重,而将另一损失归因于另一组权重)

  4. 在代码中不容易找到训练机制。事物无处不在,支持诸如加权,样本权重之类的许多事物。总结所有事物然后决定做什么/更改所需的时间太长了。

答案建议

按需在Keras中制作模型。鉴别器,生成器,它们的连接和输出。

不要编译它。相反,要跟踪主要张量(发电机输出,鉴别器输出,发电机输入),以Tensorflow样式创建损失函数,并以tensorflow样式训练一切。