如何基于DCGAN网络模型使用tensorflow生成仿真的人脸图像?(CelebA数据集)

本文介绍如何使用DCGAN网络模型和TensorFlow生成仿真的人脸图像,包括GAN网络模型的设计思想、CelebA数据集的准备及逐步构建人脸生成模型的过程。

如何基于DCGAN网络模型使用tensorflow生成仿真的人脸图像?(CelebA数据集)

1.GAN网络模型的设计思想?

在这里插入图片描述

GAN中的核心网络结构:

  • 生成器(Generator):记作G,通过对大量样本的学习,能生成一些以假乱真的样本。
  • 判别器(Discriminator):记作D,接受真实样本和G生成的样本,并进行判别和区分。
  • G和D相互博弈,通过学习,G的生成能力和D的判别能力都逐渐增强并收敛。

【注】:GAN在实际的训练中,有很多苛刻的细节要求需要注意。

2.数据集的准备?

CelebA人脸图片数据集,共202599张人脸图片,图片的宽高比=178:218。(本文涉及的数据集与代码均已上传,链接提取密码:21re

3.如何一步一步构建我们的人脸fake模型?

1.相关库的导入。

import tensorflow as tf
import numpy as np
import os
from imageio import imread, imsave
import cv2
import glob

2.设置训练图片数据集路径,拿到图片数量。设置好batch_size(读取数据的批次大小),z_dim(fake图片的原始随机点,后经过生成器(Generator)生成fake图片。),输入图片的宽和高,以及输出路径。

dataset = 'celeba'  # CelebA的图片目录路径
images = glob.glob(os.path.join(dataset, '*.*'))  # 对celeba图片目录下的所有图片进行遍历
print(len(images))
batch_size = 100#批次大小
z_dim = 100  # 每张图片的噪声维度
WIDTH = 64  # 输入图片的宽
HEIGHT = 64  # 输入图片的高
OUTPUT_DIR = 'samples_' + dataset  # 输出路径
if not os.path.exists(OUTPUT_DIR):
    os.mkdir(OUTPUT_DIR)

3.设置X(输入量),noise(随机噪声), is_training(是否进行训练,便于模型的保存和加载)的变量格式。

X = tf.placeholder(dtype=tf.float32, shape=[None, HEIGHT, WIDTH, 3], name='X')#None,图片的编号
noise = tf.placeholder(dtype=tf.float32, shape=[None, z_dim], name='noise')  # noise是二维结构,与GAN的网络模型有关
is_training = tf.placeholder(dtype=tf.bool, name='is_training')  # 是否能够训练

4.定义相关的激活函数,损失函数。

def lrelu(x, leak=0.2):
    return tf.maximum(x, leak * x)  # 优化relu激活函数

def sigmoid_cross_entropy_with_logits(x, y):
    return tf.nn.sigmoid_cross_entropy_with_logits(logits=x, labels=y)#未处理的x,标签y

5.定义判别器(Discriminator)的网络结构。

def discriminator(image, reuse=None, is_training=is_training):
    momentum = 0.9  # 指数平滑移动序列预测偏量
    with tf.variable_scope('discriminator', reuse=reuse):  # reuse是否进行迭代
        h0 = lrelu(tf.layers.conv2d(image, kernel_size=5, filters=64, strides=2, padding='same'))
        # strides在生成器中,width = width/2,height = height/2代替卷积网络的池化层操作。
        h1 = tf.layers.conv2d(h0, kernel_size=5, filters=128, strides=2, padding='same')
        h1 = lrelu(tf.contrib.layers.batch_norm(h1, is_training=is_training, decay=momentum))

        h2 = tf.layers.conv2d(h1, kernel_size=5, filters=256, strides=2, padding='same')
        h2 = lrelu(tf
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Super__Tiger

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值