Keras 中的生成对抗网络 (GAN) - 创建组合模型
Generative Adversarial Networks (GANs) in Keras - creating the combined model
我正在尝试创建一个非常简单的 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
现在我不确定如何将它们结合起来,所以鉴别器将接收生成器输出,然后传递生成器反向传播数据
为此,最好的办法是使用函数 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)
在 compile
之前使用 model.layers[i].trainable
参数定义每个模型中哪些层可训练或不可训练。
结合生成器和判别器模型确实有时会非常混乱。我在下面的 link 中找到了这个存储库,它很好地演示了如何在 keras 中构建 GAN 的多个架构的详细代码:
https://github.com/kochlisGit/Keras-GAN
我正在尝试创建一个非常简单的 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
现在我不确定如何将它们结合起来,所以鉴别器将接收生成器输出,然后传递生成器反向传播数据
为此,最好的办法是使用函数 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)
在 compile
之前使用 model.layers[i].trainable
参数定义每个模型中哪些层可训练或不可训练。
结合生成器和判别器模型确实有时会非常混乱。我在下面的 link 中找到了这个存储库,它很好地演示了如何在 keras 中构建 GAN 的多个架构的详细代码: https://github.com/kochlisGit/Keras-GAN