欢迎访问宙启技术站
智能推送

完全理解Python中的Discriminator()与Generator()的工作关系

发布时间:2023-12-29 06:18:20

在Python中,Discriminator和Generator是深度学习中用于生成对抗网络(GAN)的两个重要组件。这两个组件一起工作,以生成逼真的图像或数据。

Discriminator是一个二元分类器,它的任务是将输入数据分为真实(来自训练数据集)和假设(来自Generator)两个类别。它的目标是辨别生成数据是否真实。

Generator是一个生成器模型,它以随机噪声作为输入,并生成与真实数据相似的假数据。它的目标是迷惑Discriminator,使其将生成数据误分类为真实数据。

它们之间的工作关系是一个博弈过程。Generator的目标是生成尽可能逼真的数据以欺骗Discriminator,而Discriminator的目标是将真实和生成的数据正确区分开来。

让我们使用一个简单的例子来说明这个工作关系:

import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.optimizers import Adam

# 构建Discriminator模型
def build_discriminator(input_shape):
    model = Sequential()
    model.add(Dense(64, input_shape=input_shape, activation='relu'))
    model.add(Dropout(0.3))
    model.add(Dense(32, activation='relu'))
    model.add(Dropout(0.3))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer=Adam(0.0002, 0.5), metrics=['accuracy'])
    return model

# 构建Generator模型
def build_generator(input_shape):
    model = Sequential()
    model.add(Dense(32, input_shape=input_shape, activation='relu'))
    model.add(Dense(64, activation='relu'))
    model.add(Dense(128, activation='relu'))
    model.add(Dense(784, activation='tanh'))
    model.compile(loss='binary_crossentropy', optimizer=Adam(0.0002, 0.5))
    return model

# 构建GAN模型
def build_gan(generator, discriminator):
    discriminator.trainable = False
    model = Sequential()
    model.add(generator)
    model.add(discriminator)
    model.compile(loss='binary_crossentropy', optimizer=Adam(0.0002, 0.5))
    return model

# 定义生成和训练GAN的函数
def train_gan(generator, discriminator, gan, epochs=100, batch_size=128):
    half_batch = int(batch_size / 2)
    for epoch in range(epochs):
        # 训练Discriminator
        idx = np.random.randint(0, X_train.shape[0], half_batch)
        real_images = X_train[idx]
        noise = np.random.normal(0, 1, (half_batch, 100))
        generated_images = generator.predict(noise)

        # 构造训练数据
        X = np.concatenate([real_images, generated_images])
        y = np.zeros(2*half_batch)
        y[:half_batch] = 0.9

        discriminator.trainable = True
        d_loss = discriminator.train_on_batch(X, y)

        # 训练Generator
        noise = np.random.normal(0, 1, (batch_size, 100))
        y = np.ones(batch_size)

        discriminator.trainable = False
        g_loss = gan.train_on_batch(noise, y)

        # 每训练10个epoch打印损失
        if epoch % 10 == 0:
            print(f"Epoch {epoch},  Generator Loss: {g_loss}, Discriminator Loss: {d_loss}")

# 加载数据集
(X_train, _), (_, _) = mnist.load_data()
X_train = (X_train.astype(np.float32) - 127.5) / 127.5
X_train = np.reshape(X_train, (X_train.shape[0], -1))

# 构建并编译Discriminator和Generator模型
discriminator = build_discriminator(input_shape=(784,))
generator = build_generator(input_shape=(100,))
gan = build_gan(generator, discriminator)

# 训练GAN模型
train_gan(generator, discriminator, gan, epochs=1000)

在上面的例子中,我们首先构建了Discriminator和Generator的模型。Discriminator模型有两个隐藏层和一个输出层,输出层使用sigmoid激活函数,用于判断输入数据是真实数据还是生成数据。Generator模型有三个隐藏层和一个输出层,输出层使用tanh激活函数,用于生成假数据。然后,我们构建了一个GAN模型,通过将Generator和Discriminator连接起来。最后,我们使用train_gan函数对GAN模型进行训练,训练过程中,先训练Discriminator,然后再训练Generator。

通过以上训练过程,Generator会不断尝试生成逼真的数据以欺骗Discriminator,而Discriminator则会不断尝试正确分类数据,以提高对真实和生成数据的判断能力。经过多次迭代,Generator将学到如何生成与真实数据相似的数据,Discriminator也将学到如何正确区分真实数据和生成数据。最终,Generator生成的数据将会越来越逼真。