GAN图片生成问题
最近在学习GAN,打算从一张图片开始试手,一开始用的mnist数据集第一张图片,网络训练10000次后效果挺好的,但是换了动漫人物头像就不行了。。
运行结果及报错内容
这是mnist训练10000次的结果
已经可以和原图无异了,然后随便找了一张二次元头像:
首先试了RGB三色的GAN,结果不理想:
然后用opencv将图片调成灰度图,训练单色,结果还是不理想:
大部分区域都是白色(我在plt.show的时候没有加cmap='gray')
不知道是哪里出了问题
运行代码:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import time
import cv2
# (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
# real_image = x_train[0].reshape((1, 64, 64, 3))/255
x_train = Image.open("./20194292022539844.jpeg")
x_train = x_train.resize((64, 64))
x_train = np.array(x_train)
x_train = cv2.cvtColor(x_train, cv2.COLOR_BGR2GRAY)
real_image = x_train.reshape((1, 64, 64, 1))/255
# def Generator
def gen_generator():
generator = tf.keras.models.Sequential([
tf.keras.layers.Dense(256, input_shape=(64, 64, 1)),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.LeakyReLU(),
# tf.keras.layers.Reshape((-1,28,28)),
tf.keras.layers.Conv2DTranspose(filters=64, kernel_size=(5, 5), strides=1 ,padding='same', use_bias=False),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.LeakyReLU(),
tf.keras.layers.Conv2DTranspose(filters=32, kernel_size=(5, 5), strides=1, padding='same', use_bias=False),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.LeakyReLU(),
tf.keras.layers.Conv2DTranspose(filters=1, kernel_size=(5, 5), strides=1, padding='same', use_bias=False, activation='tanh'),
])
generator.summary()
return generator
# def Discriminator
def gen_discriminator():
discriminator = tf.keras.Sequential([
tf.keras.layers.Conv2D(64,(5,5),strides = (2,2),padding = 'same', input_shape=(64, 64, 1)),
tf.keras.layers.LeakyReLU(),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Conv2D(128,(5,5),strides = (2,2),padding = 'same'),
tf.keras.layers.LeakyReLU(),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(1),
])
discriminator.summary()
return discriminator
g = gen_generator() # create a generator
d = gen_discriminator() # create a discriminator
cross_entropy = tf.keras.losses.BinaryCrossentropy()
g_optimizer = tf.keras.optimizers.Adam(1e-4)
d_optimizer = tf.keras.optimizers.Adam(1e-4)
fake_image = tf.Variable(np.random.random(real_image.shape), dtype=tf.float32) # generate a fake image
image_record = []
for i in range(10000):
start = time.time()
if i % 10 == 0:
print(f'Time for epoch {i + 1} is {time.time() - start} sec')
with tf.GradientTape(persistent=True) as g_tape, tf.GradientTape() as d_tape: # create a record for one picture
fake_image = g(fake_image, training=True)
real_pred = d(real_image, training=True) # use Discriminator to predict real_image
fake_pred = d(fake_image, training=True) # use Discriminator to predict fake_image
# calculate loss
# 1.generater loss
generator_loss = cross_entropy(tf.ones_like(fake_pred), fake_pred) # or 1
# Generator create fake image, and expects Discriminator predict fake image as True(1)
# 2.discriminator loss
real_loss = cross_entropy(tf.ones_like(real_pred), real_pred) # Discriminator expects true image as True
fake_loss = cross_entropy(tf.zeros_like(fake_pred), fake_pred) # Discriminator expects fake image as False
discriminator_loss = real_loss + fake_loss
# g_tape.watch(generator_loss)
# d_tape.watch(discriminator_loss)
# gradient
g_gradients = g_tape.gradient(generator_loss, g.trainable_variables) # f'(g)
d_gradients = d_tape.gradient(discriminator_loss, d.trainable_variables) # f'(d)
# assign weight
g_optimizer.apply_gradients(zip(g_gradients, g.trainable_variables)) # use Adam to apply gradients(g_gradients) to trainable variables
d_optimizer.apply_gradients(zip(d_gradients, d.trainable_variables))
for_fake_image = (fake_image - tf.reduce_min(fake_image))/ (tf.reduce_max(fake_image) - tf.reduce_min(fake_image))
image_record.append(for_fake_image.numpy().reshape((64, 64)))
count = 0
for j in range(len(image_record)):
if j % 400 == 0:
plt.subplot(5, 5, count+1)
count += 1
plt.axis('off')
plt.imshow(image_record[j])
plt.title(j)
不知道是哪个方面出了问题,对GAN网络一知半解😭还处于半懂半懵的状态,想解决完这个彩色图片生成的问题后尝试提高batch,希望有带佬指点一下!