Sakura Memory? 2022-06-11 23:40 采纳率: 0%
浏览 29
已结题

GAN生成彩色图片的效果不好?

GAN图片生成问题

最近在学习GAN,打算从一张图片开始试手,一开始用的mnist数据集第一张图片,网络训练10000次后效果挺好的,但是换了动漫人物头像就不行了。。

运行结果及报错内容

这是mnist训练10000次的结果

img

已经可以和原图无异了,然后随便找了一张二次元头像:

img

首先试了RGB三色的GAN,结果不理想:

img

然后用opencv将图片调成灰度图,训练单色,结果还是不理想:

img

大部分区域都是白色(我在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,希望有带佬指点一下!

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 6月19日
    • 创建了问题 6月11日

    悬赏问题

    • ¥15 虚拟机检测,可以是封装好的DLL,可付费
    • ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)
    • ¥15 开发一个类似百度网盘的软件,在主页 文件列表点击进入文件夹,在文件夹里面还有文件夹,代码该怎么写?
    • ¥30 使用matlab将观测点聚合成多条目标轨迹
    • ¥15 Workbench中材料库无法更新,如何解决?
    • ¥20 如何推断此服务器配置
    • ¥15 关于github的项目怎么在pycharm上面运行
    • ¥15 内存地址视频流转RTMP
    • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
    • ¥15 有没有整苹果智能分拣线上图像数据