要想讲清楚DCGAN就要必须先说GAN,毕竟DCGAN是前者的升级版。
GAN也就是对抗生成网络,所谓对抗生成,也就是有两个网络,一个D(判别),另一个G(生成)。两个网络的目标函数,是不一样的。G网络的目标函数是让生成的图片,在D网络中尽量判别为真,而D网络的目标就是能最大限度的判别出输入图片,是由G网络生成的,还是非生成的。
DCGAN也是这样的思想,只不过加上了卷积层,来更好的实现。有4个特点:
1、D网络模型,使用的是带步长的卷积取代池化层,进行下采样。
2、G网络模型,使用,进行上采样。
3、激活函数为LeakyReLu
4、使用Batch Normalization标准化
下面展示一下用mnist数据集,实现DCGAN。
导入数据,定义真实输入和噪音向量。
import numpy as np
import tensorflow as tf
import pickle
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets()
def get_inputs(noise_dim, image_height, image_width, image_depth):
inputs_real = tf.placeholder(tf.float32, [None, image_height, image_width, image_depth], name='inputs_real')
inputs_noise = tf.placeholder(tf.float32, [None, noise_dim], name='inputs_noise')
return inputs_real, inputs_noise
定义一个生成网络,也就是G网络。注意只在最后使用Tanh激活函数,其他反卷积层都使用relu激活函数。
def get_generator(noise_img, output_dim, is_train=True):
with tf.variable_scope("generator", reuse=(not is_train)):
layer1 = tf.layers.dense(noise_img, 4*4*512)
layer1 = tf.reshape(layer1, [-1, 4, 4, 512])
#batch normalization
layer1 = tf.layers.batch_normalization(layer1, training=is_train)
layer1 = tf.nn.relu(layer1)
#dropout
layer1 = tf.nn.dropout(layer1, keep_prob=0.8)
#conv
layer2 = tf.layers.conv2d_transpose(layer1, 256, 4, strides=(1, 1), padding='valid')