一、DCGAN介绍
DCGAN即使用卷积网络的对抗网络,其原理和GAN一样,只是把CNN卷积技术用于GAN模式的网络里,G(生成器)网在生成数据时,使用反卷积的重构技术来重构原始图片。D(判别器)网用卷积技术来识别图片特征,进而做出判别。同时,CDGAN中的卷积神经网络也做了一些结构的改变,以提高样本的质量和收敛速度。
DCGAN的generator网络结构图如下:
- G网中使用ReLU作为激活函数,最后一层使用Tanh作为激活函数。
- 去掉了FC层,使网络变为全卷积网络。
DCGAN的discriminator网络结构图如下:
- D中取消所有的池化层,使用转置卷积(transposed convolutional layer)并且步长大于等于2进行上采样。
- D网中也加入stride的卷积代替pooling。
- 在D网和G网中均使用批量归一化(batch normalization),而在最后一层时通常不会使用batch normalization,这是为了保证模型能够学习到数据的正确均值和方差。
- D网络中使用LeakyReLU作为激活函数。
- DCGAN中换成了两个卷积神经网络(CNN)的G和D,可以刚好的学习对输入图像层次化的表示,尤其在生成器部分会有更好的模拟效果。DCGAN在训练过程中会使用Adam优化算法。
三、网络实现
以人脸数据为例
1、环境配置(Environments)
- window10
- python3.6.4
- TensorFlow1.13.1
2、数据准备
数据集:face-swap
数据可以从网上自行下载,或者利用自己的数据,这里对数据的没有严格要求。我是采用了网络上的数据集,这里给出数据的下载地址:https://anonfile.com/p7w3m0d5be/face-swap.zip将解压的数据分别放入文件夹A和文件夹B
3、超参数设置(Hyper-Parameters)
- Image Size = 64x64
- Batch Size = 64
- Learning Rate = 0.00005
- Adam_beta1 = 0.5
- z_dim = 100
- Epoch = 500
# 导入需要的包
from PIL import Image # Image 用于读取影像
#from skimage import io # io也可用于读取影响,效果比Image读取的更好一些
import tensorflow as tf # 用于构建神经网络模型
import matplotlib.pyplot as plt # 用于绘制生成影像的结果
import numpy as np # 读取影像
import os # 文件夹操作
import time # 计时
# 设置相关参数
is_training = True
input_dir = "./face/" # 原始数据的文件夹路径
# 设置超参数 hyper parameters
batch_size = 64
image_width = 64
image_height = 64
image_channel = 3
data_shape = [64, 64, 3]
data_length = 64 * 64 * 3
z_dim = 100
learning_rate = 0.00005
beta1 = 0.5
epoch = 500
4、读取数据并将原始数据数据resize成64*64*3的格式,原始图像大小为256*256*3
# 读取数据的函数
def prepare_data(input_dir, floder):
'''
函数功能:通过输入图像的路径,读取训练数据
:参数 input_dir: 图像数据所在的根目录,即"./face"
:参数 floder: 图像数据所在的子目录, 即"./face/A"
:return: 返回读取好的训练数据
'''
# 遍历图像路径,并获取图像数量
images = os.listdir(input_dir + floder)
image_len = len(images)