GENs生成对抗神经网络demo实例

import tensorflow as tf
from tensorflow.keras import layers
import numpy as np
import matplotlib.pyplot as plt

# 设置随机种子以便结果可重复
tf.random.set_seed(42)
np.random.seed(42)

# 定义生成器模型
def build_generator(input_shape):
    model = tf.keras.Sequential([
        layers.Dense(256, input_shape=input_shape, activation='relu'),
        layers.Dense(512, activation='relu'),
        layers.Dense(1024, activation='relu'),
        layers.Dense(784, activation='sigmoid'),
        layers.Reshape((28, 28, 1))
    ])
    return model

# 定义判别器模型
def build_discriminator(input_shape):
    model = tf.keras.Sequential([
        layers.Flatten(input_shape=input_shape),
        layers.Dense(1024, activation='relu'),
        layers.Dense(512, activation='relu'),
        layers.Dense(256, activation='relu'),
        layers.Dense(1, activation='sigmoid')
    ])
    return model

# 定义GAN模型
def build_gan(generator, discriminator):
    discriminator.trainable = False
    model = tf.keras.Sequential([generator, discriminator])
    return model

# 创建生成器、判别器和GAN模型
generator = build_generator((100,))
discriminator = build_discriminator((28, 28, 1))
gan = build_gan(generator, discriminator)

# 定义优化器和损失函数
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
loss_fn = tf.keras.losses.BinaryCrossentropy()

# 准备虚拟的数据集(这里仅作示例,实际应该使用真实数据集)
real_images = tf.random.normal([128, 28, 28, 1])
real_labels = tf.ones((128, 1))  # Real images are labeled as 1
fake_labels = tf.zeros((128, 1))  # Fake images are labeled as 0

# 训练模型
def train(generator, discriminator, gan, epochs, display_interval):
    for epoch in range(epochs):
        # 随机噪声
        noise = tf.random.normal([128, 100])

        with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:
            generated_images = generator(noise, training=True)

            real_output = discriminator(real_images, training=True)
            fake_output = discriminator(generated_images, training=True)

            # 判别器损失
            disc_loss_real = loss_fn(real_labels, real_output)
            disc_loss_fake = loss_fn(fake_labels, fake_output)
            disc_loss = (disc_loss_real + disc_loss_fake) / 2

            # 生成器损失
            gen_loss = loss_fn(real_labels, fake_output)

        # 梯度更新
        gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)
        gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)

        optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))
        optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))

        # 每100轮后显示生成的图像
        if (epoch + 1) % 100 == 0 or epoch == 0:
            print(f'Epoch {epoch + 1}, Generator Loss: {gen_loss.numpy()}, Discriminator Loss: {disc_loss.numpy()}')
            show_images(generator)

def show_images(generator, num_images=5):
    noise = tf.random.normal([num_images, 100])
    generated_images = generator(noise, training=False)
    generated_images = (generated_images * 255).numpy().astype(np.uint8)
    fig, axes = plt.subplots(1, num_images, figsize=(10, 2))
    for img, ax in zip(generated_images, axes):
        ax.imshow(img.squeeze(), cmap='gray')
        ax.axis('off')
    plt.show()

# 训练模型
train(generator, discriminator, gan, 500, 100)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fairy要carry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值