如何控制在 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 = 300
和 batch size = 128
将目标数字设置为 5。这是 epoch=150 时的 what 生成器图:; and epoch=300:
我对 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 = 300
和 batch size = 128
将目标数字设置为 5。这是 epoch=150 时的 what 生成器图: