使用 GAN 生成手写数字
以下是一个使用 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 著作权归作者所有。请勿转载和采集!