UNSUPERVISED REPRESENTATION LEARNING WITH DEEP CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORKS
DCGAN
DCGAN和GAN原理基本是差不多,只是它把原本GAN中的生成模型G和判别模型D的多层感知机改成了两个神经网络(CNN)。但是还对网络的结构做了一定的调整。
- 取消pooling层。G采用反卷积(Deconvolutional layer)来进行上采样,D加了带步长(stride)的卷积来替代pooling
- D和G都是用Batch Normalization
- 没有全连接层(FC),纯粹的CNN
- G隐藏层用ReLU,最后一层用tanh做激活函数
- D隐藏层用LeakyReLU,最后一层用softmax做激活函数
以图像左上角为例,传统的卷积操作卷积核的核心一般是在输入图像内部的,而反卷积的卷积核核心是会超出外面的,所以有放大作用。但注意只是size放大,值并没有放大。
这是生成器的网络结构,文中并没有具体给出判别器的结构。
DCGAN实现了两个功能,一是可以用来作为无监督的特征提取器,类似K-means那样。另一个则是让图片实现了类似词向量那样的加减功能。(e.g. woman - king - man = queen)
实现
本次实验参考了Github上面的某一版本的代码,进行精简实现。
实验环境
Tensorflow == 1.8.0
Python = 3.5.2
matplotlib
numpy
[可选]ipython(安装方法)
效果图
最初
中间某状态
动态效果
收敛速度及效果明显比用多层感知机的GAN要好
代码
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import numpy as np
import os
import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
%matplotlib inline
img_height = 28
img_width = 28
batch_size = 100
out_height = 28
out_width = 28
c_dim = 1
y_dim = 10
df_dim = 64
dfc_dim = 1024
gf_dim = 64
gfc_dim = 1024
max_epoch = 300
z_dim = 100 # 噪声维度
save_path = './dcgan_output2/'
def lrelu(x,leak=0.2):
'''参考Rectier N