「埃尔法哥哥」快速看懂如何使用GAN生成“真实”的人脸( 二 )


尽管GAN的概念在理论上很简单 , 但要建立一个有效的模型却非常困难 。 在GAN中 , 有两个深层网络耦合在一起 , 使得反向传播梯度的难度提高了两倍 。
深度卷积GAN(DCGAN)是演示如何构建实用的GAN的模型之一 , 该GAN可以自己学习如何合成新图像 。 DCGAN与GAN非常相似 , 但专门致力于使用深度卷积网络代替Vanilla GAN中使用的全连接网络 。
卷积网络有助于发现图像中的深层相关性 , 即它们寻找空间相关性 。 这意味着DCGAN将是图像/视频数据的更好选择 , 而GAN可以被认为是DCGAN和许多其他体系结构(CGAN , CycleGAN , StarGAN等)已经发展起来的一般思想 。
让我们加载数据集并查看输入图像的外观:
import numpy as np
import pandas as pd
import os
import tensorflow as tf
PIC_DIR = 'D:/Jupyter/celeba-dataset/img_align_celeba/img_align_celeba/'
from tqdm import tqdm
from PIL import Image
IMAGES_COUNT = 10000
ORIG_WIDTH = 178
ORIG_HEIGHT = 208
diff = (ORIG_HEIGHT - ORIG_WIDTH) // 2
WIDTH = 128
HEIGHT = 128
crop_rect = (0, diff, ORIG_WIDTH, ORIG_HEIGHT - diff)
images = []
for pic_file in tqdm(os.listdir(PIC_DIR)[:IMAGES_COUNT]):
pic = Image.open(PIC_DIR + pic_file).crop(crop_rect)
pic.thumbnail((WIDTH, HEIGHT), Image.ANTIALIAS)
images.append(np.uint8(pic))
「埃尔法哥哥」快速看懂如何使用GAN生成“真实”的人脸
本文插图
显示我们图像的格式
【「埃尔法哥哥」快速看懂如何使用GAN生成“真实”的人脸】images = np.array(images) / 255
print(images.shape)
from matplotlib import pyplot as plt
「埃尔法哥哥」快速看懂如何使用GAN生成“真实”的人脸
本文插图
我们的部分图像输出出来:
plt.figure(1, figsize=(10, 10))
for i in range(25):
plt.subplot(5, 5, i+1)
plt.imshow(images[i])
plt.axis('off')
plt.show()
「埃尔法哥哥」快速看懂如何使用GAN生成“真实”的人脸
本文插图
下一步是创建一个生成器:
生成器则采用另一种方式:试图欺骗判别器的是艺术家 。 该网络由8个卷积层组成 。 在这里 , 首先 , 我们接受输入 , gen_input并将其输入到第一个卷积层中 。 每个卷积层都执行卷积 , 然后执行批归一化以及leaky ReLu 。 然后 , 我们返回tanh激活函数 。
from keras import Input
from keras.layers import Dense, Reshape, LeakyReLU, Conv2D, Conv2DTranspose, Flatten, Dropout
from keras.models import Model
from keras.optimizers import RMSprop
LATENT_DIM = 32
CHANNELS = 3
def create_generator():
gen_input = Input(shape=(LATENT_DIM, ))
x = Dense(128 * 16 * 16)(gen_input)
x = LeakyReLU()(x)
x = Reshape((16, 16, 128))(x)
x = Conv2D(256, 5, padding='same')(x)
x = LeakyReLU()(x)
x = Conv2DTranspose(256, 4, strides=2, padding='same')(x)
x = LeakyReLU()(x)
x = Conv2DTranspose(256, 4, strides=2, padding='same')(x)
x = LeakyReLU()(x)
x = Conv2DTranspose(256, 4, strides=2, padding='same')(x)
x = LeakyReLU()(x)
x = Conv2D(512, 5, padding='same')(x)