Keras的对抗模型和优化程序
keras-adversarial的Python项目详细描述
将多个模型合并为一个keras模型。甘斯放轻松了!
AdversarialModel模拟多人游戏。一个电话 model.fit为每个玩家获取目标并更新所有 玩家。使用AdversarialOptimizer完全控制 更新是同时的、交替的,或者完全是其他的。否 更愚蠢的是Trainable!
安装
git clone https://github.com/bstriner/keras_adversarial.git
cd keras_adversarial
python setup.py install
用法
请检查示例文件夹中的示例用法。
实例化对抗模型
- 为每个组件/播放器(如生成器)构建单独的模型 还有鉴别器。
- 建立一个组合模型。对于gan,这可能有一个输入 图像和噪声输入,d(假)和输出 对于d(实数)
- 将组合模型和单独模型传递给 AdversarialModel构造函数
adversarial_model=AdversarialModel(base_model=gan,player_params=[generator.trainable_weights,discriminator.trainable_weights],player_names=["generator","discriminator"])
生成的模型将具有与gan相同的输入,但是是独立的 每个玩家的目标和指标。这是通过复制 每个玩家的模型。如果每个玩家有不同的模式,使用 player_models(关于辍学,见下文)。
adversarial_model=AdversarialModel(player_models=[gan_g,gan_d],player_params=[generator.trainable_weights,discriminator.trainable_weights],player_names=["generator","discriminator"])
编制对抗模型
使用adversarial_compile编译模型。参数是 AdversarialOptimizer和每个对象的Optimizer对象列表 玩家。每个模型的损失都传递给model.compile,因此可能 成为字典或其他物品。使用相同的顺序 player_optimizers就像你对player_params和 player_names。
model.adversarial_compile(adversarial_optimizer=adversarial_optimizer,player_optimizers=[Adam(1e-4,decay=1e-4),Adam(1e-3,decay=1e-4)],loss='binary_crossentropy')
训练一个简单的对抗模型
对抗模型可以使用fit和回调进行训练,就像 任何其他凯拉斯模型。只要确保提供正确的目标 正确的顺序。
例如,给定名为gan:*的简单gan输入:[x]* 目标:[y_fake, y_real]*指标: [loss, loss_y_fake, loss_y_real]
AdversarialModel(base_model=gan, player_names=['g','d']...)将 有:*个输入:[x]*个目标: [g_y_fake, g_y_real, d_y_fake, d_y_real]*度量: [loss, g_loss, g_loss_y_fake, g_loss_y_real, d_loss, d_loss_y_fake, d_loss_y_real]
对抗优化器
优化多人游戏有很多可能的策略。 AdversarialOptimizer是抽象这些策略的基类 并负责创建培训功能。* AdversarialOptimizerSimultaneous同时更新每个播放器 *AdversarialOptimizerAlternating更新 循环*UnrolledAdversarialOptimizer展开更新到 稳定训练(仅在ano中测试;建立图表速度慢但运行 相当快)
示例
展开的生成性对抗网络
example_gan_unrolled.py 演示如何使用展开优化器。
警告:展开鉴别器8次大约需要6小时 在我的电脑上建立这个功能,但只有几分钟的时间 训练。准备好让它长时间运行或降低深度 四点左右。
注释
辍学
当使用辍学来训练对手模型时,您可能需要创建 每个玩家有不同的型号。
如果你想训练一个辍学的鉴别器,但是训练 生成器对鉴别器无脱落,创建两个模型。 *列车发电机:^{TT28}$*甘托 列车识别器:D(G(z, dropout=0), dropout=0.5)
如果创建单独的模型,请使用 AdversarialModel构造函数。
如果不使用dropout,一个模型就足够了,并使用 base_model参数的AdversarialModel构造函数,它将 为每个玩家复制base_model。
Theano和Tensorflow
我大部分的发展都是在theano完成的,但是我试着在 有多余的时间。目标是支持两者。请告诉我 两个后端都有问题。
有问题吗?
如果你有任何问题或公关,可以在这里或Keras开始。 任何可能有用的问题或想法。