如何控制在 MNIST 中训练的 GAN 生成哪个数字?

How to control which digit is generated from a GAN trained in MNIST?

我对 GAN 很感兴趣,所以我学习了本教程 link about GANs for MNIST with Keras. The result was that it generated a 4x4 image with random digit like this. I want to ask how to generate 4x4 image with digit that I want and not random digits like this。

def plot_generated_images(epoch, generator, examples=16, dim=(4, 4), figsize=(4, 4)):
    noise = np.random.normal(0, 1, size=[examples, random_dim])
    generated_images = generator.predict(noise)
    generated_images = generated_images.reshape(examples, 28, 28)

plt.figure(figsize=figsize)

for i in range(generated_images.shape[0]):
    plt.subplot(dim[0], dim[1], i+1)
    plt.imshow(generated_images[i], interpolation='nearest', cmap='gray_r')
    plt.axis('off')

plt.tight_layout()
plt.savefig('gan_generated_image_epoch_%d.png' % epoch)

您使用的 GAN 类型无法控制它生成的数字。为此,您需要训练 Conditional GAN

您必须控制 GAN 生成的图像的唯一方法是通过输入到生成器的噪声向量。您可以尝试更改此向量的值,直到获得所需的数字。

最简单的方法是通过随机种子

np.random.seed(13)  # changing this number will result in different digits being created
noise = np.random.normal(0, 1, size=[examples, random_dim])
generated_images = generator.predict(noise)
generated_images = generated_images.reshape(examples, 28, 28)

另一种方法是过滤训练数据,比如

from tensorflow.keras.datasets import mnist

# Set specific target digit you want to generator
TARGET_DIGIT = 5

# Get data
(trainX, trainy), (testX, testy) = mnist.load_data()

# Filter it
trainX, trainy = trainX[trainy==TARGET_DIGIT], trainy[trainy==TARGET_DIGIT]

然后根据过滤后的数据和噪声训练 GAN 模型。因为判别器只是把它分类为假的或真的,所以如果只使用特定的数字标签来训练应该没问题。

通过为每个数字重复 10 次,您可以生成您想要的数字。 但是记住训练数据量减少了,epochs 需要同时增加。

我尝试通过给定具有基本 GAN 架构的 epochs = 300batch size = 128 将目标数字设置为 5。这是 epoch=150 时的 what 生成器图:; and epoch=300: