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

Python 在Keras中培训GAN时,是否需要多次通过以优化生成器和鉴别器?,python,tensorflow,keras,Python,Tensorflow,Keras,我比Keras更熟悉tensorflow图训练,但我在这里尝试Keras 在构建GAN时,需要针对与鉴别器不同的损耗(相反的损耗)对发生器进行优化。在基本tensorflow中,使用2个优化器或调用优化器即可轻松实现。计算梯度(…)和优化器。使用适当的权重组分别应用梯度(…) 在凯拉斯,我看不出我能做到这两个。在诸如的实现中,似乎将生成器和鉴别器的训练分解为单独的模型,然后逐批独立训练。这意味着每次有效更新所需的过程比基本tensorflow实现(两个优化器在一个过程中运行)所需的过程多得多 是

我比Keras更熟悉tensorflow图训练,但我在这里尝试Keras

在构建GAN时,需要针对与鉴别器不同的损耗(相反的损耗)对发生器进行优化。在基本tensorflow中,使用2个优化器或调用
优化器即可轻松实现。计算梯度(…)
优化器。使用适当的权重组分别应用梯度(…)

在凯拉斯,我看不出我能做到这两个。在诸如的实现中,似乎将生成器和鉴别器的训练分解为单独的模型,然后逐批独立训练。这意味着每次有效更新所需的过程比基本tensorflow实现(两个优化器在一个过程中运行)所需的过程多得多

是否有一种方法来实现GAN的优化器,以便生成器和鉴别器在Keras中一次通过培训


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

  • 一个模型只能有一个优化器。。。有必要更改源代码,使其能够接受两个或多个

  • 即使使用自定义优化器,也可以分离权重,但它不提供分离损失的支持,如中所示。概率是优化器已经计算出最终的公共损失(这样就不可能将一个损失归因于一组权重,另一个归因于另一组权重)

  • 在代码中不容易找到训练机制。事情分散在各个方面,支持许多事情,如损失权重、样本权重等。总结所有事情,然后决定做什么/改变所需的时间太长

  • 答复建议 用Keras制作您的模型。鉴别器、发生器及其连接和输出


    只是不要编译它。相反,跟踪主要张量(生成器输出、鉴别器输出、生成器输入),以Tensorflow样式创建损失函数,并以Tensorflow样式训练所有内容。

    是否可以在TF中提供(或指向)一个使用
    优化器实现GAN的示例。计算梯度(…)
    优化器。应用梯度(…)
    ?另外,在TF中有2个优化器与在Keras中将GAN拆分为单独的模型有什么不同?(我不熟悉TF实现)主要的性能差异是在使用两个模型时需要进行两次前向传递计算。此外,在Keras中,您必须使用
    批量训练
    ,它不支持任何奇特的分布式模式训练,因此Keras的附加值正在减少。我没有完整的实现示例,但这里有一个小代码段,我将单个更新与组合更新进行了比较(与您的问题有点类似,我在这里测试了一个多任务模型,这可能是一个有用的代码段,用于说明TF base中的一步渐变更新):您使用的是什么?这两个损失函数都通过鉴别器了吗?我没有指定GAN,因为我正在构建的模型是自动编码器和GAN组件的组合,我想让问题保持简单,但我正在处理的增加的复杂性只会加剧我对重复计算的担忧。但是你可以考虑InfoGAN的问题,它离我正在做的不远。是的,发电机损耗必须通过鉴别器(我实际上没有意识到存在一个不以这种方式运行的架构?)。我的建议是:按照您的意愿构建Keras模型(但不要编译它们)。以tensorflow方式创建损失,并使用tensorflow优化器进行培训。