Keras中的生成性对抗网络(GAN) - 创建组合模型

时间:2017-11-22 14:50:01

标签: keras generative adversarial-machines

我正在尝试创建一个非常简单的GAN模型,并且不确定如何组合生成器和鉴别器来训练生成器

from keras import optimizers
from keras.layers import Input, Dense
from keras.models import Sequential, Model
import numpy as np
def build_generator(input_dim=10, output_dim=40, hidden_dim=28):
     model = Sequential()
     model.add(Dense(hidden_dim, input_dim=input_dim, activation='sigmoid', kernel_initializer="random_uniform"))
     model.add(Dense(output_dim, activation='sigmoid', kernel_initializer="random_uniform"))
     return model

def build_discriminator(input_dim=40, hidden_dim=28, output_dim=50):
    input_d = Input(shape=(input_dim,))
    encoded = Dense(hidden_dim, activation='sigmoid', kernel_initializer="random_uniform")(input_d)
    decoded = Dense(output_dim, activation='sigmoid', kernel_initializer="random_uniform")(encoded)
    x = Dense(1, activation='relu')(encoded)
    y = Dense(1, activation='sigmoid')(encoded)
    model = Model(inputs=input_d, outputs=[decoded, x, y])
    return model

sgd = optimizers.SGD(lr=0.1) 
generator = build_generator(10, 100, 70)
discriminator = build_discriminator(100, 60, 80)
generator.compile(loss='mean_squared_error', optimizer=sgd)
discriminator.trainable = True
discriminator.compile(loss='mean_squared_error', optimizer=sgd)
discriminator.trainable = False

现在我不确定如何将它们两者结合起来,因此鉴别器将接收发生器输出而不是将生成器反向传播数据

2 个答案:

答案 0 :(得分:1)

为此,最好的方法是使用功能Model API。这适用于更复杂的模型,接受分支,连接等。

(在这种特殊情况下仍然可以使用顺序模型,但使用功能API对我来说总是听起来更好,自由和模型上的进一步实验)

因此,您可以保留两个连续模型。您所要做的就是构建包含这两个模型的第三个模型。

generator = build_generator(....) #don't create a new generator, use the one you have. 
discriminator = build_discriminator(....)

现在,功能API模型的输入形状定义如下:

inputTensor = Input(inputShape) #inputShape must be the same as in generator     

我们通过将输入传递给图层并获取输出来工作:

#Getting the output of the generator given our input tensor:
genOut = generator(inputTensor) #you call a model just like you call a layer    

#and we pass the generator's output to the discriminator, getting its output:
discOut = discriminator(genOut)

最后,我们通过定义其起点和终点来创建实际模型:

GAN = Model(inputTensor, discOut)

model.layers[i].trainable之前使用compile参数来定义每个模型中哪些图层可以训练。

答案 1 :(得分:0)

结合生成器和判别器模型有时确实会令人困惑。我在下面的链接中找到了这个存储库,它很好地演示了如何在 keras 中构建多个 GAN 架构的详细代码: https://github.com/kochlisGit/Keras-GAN