以下是一个使用 GAN 生成手写数字的生成器的代码示例:

首先,我们需要导入必要的库:

import numpy as np
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense, Flatten, Reshape, Dropout
from keras.layers.convolutional import Conv2D, Conv2DTranspose
from keras.layers.normalization import BatchNormalization
from keras.layers.advanced_activations import LeakyReLU
from keras.optimizers import Adam
from keras.datasets import mnist

然后,我们需要加载 MNIST 数据集:

(x_train, _), (_, _) = mnist.load_data()
x_train = x_train / 127.5 - 1.
x_train = np.expand_dims(x_train, axis=3)

接下来,我们可以定义生成器和判别器的网络结构:

def build_generator():
    model = Sequential()
    model.add(Dense(256, input_dim=100))
    model.add(LeakyReLU(alpha=0.2))
    model.add(BatchNormalization())
    model.add(Dense(512))
    model.add(LeakyReLU(alpha=0.2))
    model.add(BatchNormalization())
    model.add(Dense(1024))
    model.add(LeakyReLU(alpha=0.2))
    model.add(BatchNormalization())
    model.add(Dense(28 * 28 * 1, activation='tanh'))
    model.add(Reshape((28, 28, 1)))
    return model

def build_discriminator():
    model = Sequential()
    model.add(Conv2D(64, (5, 5), strides=(2, 2), padding='same', input_shape=(28, 28, 1)))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.3))
    model.add(Conv2D(128, (5, 5), strides=(2, 2), padding='same'))
    model.add(LeakyReLU(alpha=0.2))
    model.add(Dropout(0.3))
    model.add(Flatten())
    model.add(Dense(1, activation='sigmoid'))
    return model

然后,我们可以定义 GAN 的训练过程:

def build_gan(generator, discriminator):
    optimizer = Adam(lr=0.0002, beta_1=0.5)

    discriminator.trainable = False
    gan = Sequential()
    gan.add(generator)
    gan.add(discriminator)
    gan.compile(loss='binary_crossentropy', optimizer=optimizer)

    return gan

def train_gan(generator, discriminator, gan, epochs=100, batch_size=128):
    for epoch in range(epochs):
        for batch in range(x_train.shape[0] // batch_size):
            noise = np.random.normal(0, 1, size=(batch_size, 100))
            fake_images = generator.predict(noise)

            real_images = x_train[np.random.randint(0, x_train.shape[0], size=batch_size)]

            x = np.concatenate([real_images, fake_images])
            y = np.zeros(2 * batch_size)
            y[:batch_size] = 0.9

            discriminator.trainable = True
            discriminator.train_on_batch(x, y)

            noise = np.random.normal(0, 1, size=(batch_size, 100))
            y = np.ones(batch_size)
            discriminator.trainable = False
            gan.train_on_batch(noise, y)

        if (epoch + 1) % 10 == 0:
            print('Epoch {} completed'.format(epoch + 1))
            generate_and_save_images(generator, epoch + 1)

最后,我们可以定义一个函数来生成和保存图像:

def generate_and_save_images(generator, epoch):
    noise = np.random.normal(0, 1, size=(100, 100))
    generated_images = generator.predict(noise)
    generated_images = 0.5 * generated_images + 0.5
    fig, axs = plt.subplots(10, 10, figsize=(10, 10))
    cnt = 0
    for i in range(10):
        for j in range(10):
            axs[i, j].imshow(generated_images[cnt, :, :, 0], cmap='gray')
            axs[i, j].axis('off')
            cnt += 1
    fig.savefig('generated_images/{}.png'.format(epoch))
    plt.close()

现在我们可以训练 GAN 并生成手写数字图像:

generator = build_generator()
discriminator = build_discriminator()
gan = build_gan(generator, discriminator)
train_gan(generator, discriminator, gan, epochs=200)

训练完成后,生成的图像将保存在“generated_images”文件夹中。


原文地址: https://www.cveoy.top/t/topic/nF9B 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录