DCGAN的github地址:https://github.com/carpedm20/DCGAN-tensorflow

对抗神经网络算法改进 对抗神经网络生成图片_深度学习


对抗神经网络算法改进 对抗神经网络生成图片_对抗神经网络算法改进_02


DCGAN

1.网络结构图:

对抗神经网络算法改进 对抗神经网络生成图片_深度学习_03


D网络:

对抗神经网络算法改进 对抗神经网络生成图片_对抗神经网络算法改进_04


对抗神经网络算法改进 对抗神经网络生成图片_对抗神经网络算法改进_05


以上是网络结构示意图

以下是程序的目录结构,下面的图片就是我训练时生成的图片了,代码看到上去很简单。

对抗神经网络算法改进 对抗神经网络生成图片_机器学习_06


下面是主要的一些文件用途和作用:

main.py: 主程序,主要是参数配置

model.py: G、D网络模型及训练过程

utils.py: 图像处理及可视化。

ops.py: 定义运算,例如卷积、反卷积、leakyrelu、BN层、linear层

download.py: 下载数据集

基于DCGAN源码,主要修改的位置:

input_height: 改成数据集图片的尺寸,这里我的是96

out_height: 随便改,但最好不要大于原图尺寸,这里我改成64

dataset:这是放数据集的文件名

data_dir:放数据集的文件的目录

train、crop、visualize:true
DCGAN_class.py就可以进行训练了。
config = tf.ConfigProto()
config.gpu_options.allow_growth = True

BATCH_SIZE = TFR_process.BATCH_SIZE
IMAGE_SIZE = 64
IMAGE_CHANNEL = 3
EPOCH = 60
IMAGE_PATH = “./Data_Set/cartoon_faces”
NUM_IMAGE = len(os.listdir(IMAGE_PATH))
STEPS = NUM_IMAGE // BATCH_SIZE
上面的直接看英文名称就懂了,主要是设置每次对抗训练的次数,多少次生成一张图片。
self.sess = sess
self.z_dim = z_dim # 噪声向量长度
self.c_dim = c_dim # 图片channel数目
self.gf_dim = gf_dim # G生成通道基准
self.gfc_dim = gfc_dim # ac_gan中最初还原的向量长度
self.df_dim = df_dim # D生成通道基准
self.dfc_dim = dfc_dim # ac_gan中最后一层全连接的输入维度的向量长度
self.batch_size = batch_size # 训练批次图数目
self.input_height = input_height # 图片高度
self.input_width = input_width # 图片宽度

self.inputs, _ = TFR_process.batch_from_tfr()
    self.z = tf.placeholder(tf.float32, [None, self.z_dim], name='z')
    
    # real数据通过判别器
    d, d_logits = self.discriminator(self.inputs, reuse=False)
    # fake数据生成
    g = self.generator(self.z)
    # fake数据通过判别器,注意来源不同的数据流流经同一结构,要reuse
    d_, d_logits_ = self.discriminator(g, reuse=True)
    # 用生成器生成示例的节点,其数据来源于上面的g相同,故图不需要reuse
    self.s = self.generator(self.z, train=False)

    # 损失函数生成
    # D的real损失:使真实图片进入D后输出为1,只训练D的参数
    self.d_loss_real = tf.reduce_mean(
        tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits, labels=tf.ones_like(d)))
    # D的fake损失:噪声经由G后进入D,使D的输出为0,只训练D的参数
    self.d_loss_fake = tf.reduce_mean(
        tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_, labels=tf.zeros_like(d_)))

    # G的损失:噪声经由G后进入D,使D的输出为1,只训练G的参数
    self.g_loss = tf.reduce_mean(
        tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_, labels=tf.ones_like(d_)))
    # D的损失:D的real损失 + D的fake损失,只训练D的参数
    self.d_loss = tf.add(self.d_loss_real, self.d_loss_fake)

    t_vars = tf.trainable_variables()
    g_vars = [var for var in t_vars if var.name.startswith('generator')]
    d_vars = [var for var in t_vars if var.name.startswith('discriminator')]

    self.d_optim = tf.train.AdamOptimizer(learning_rate, beta1=beat1) \
        .minimize(self.d_loss, var_list=d_vars)
    self.g_optim = tf.train.AdamOptimizer(learning_rate, beta1=beat1) \
        .minimize(self.g_loss, var_list=g_vars)

    z_sum = tf.summary.histogram("z", self.z)
    d_sum = tf.summary.histogram("d", d)
    d__sum = tf.summary.histogram("d_", d_)
    g_sum = tf.summary.image("G", g)
    d_loss_real_sum = tf.summary.scalar("d_loss_real", self.d_loss_real)
    d_loss_fake_sum = tf.summary.scalar("d_loss_fake", self.d_loss_fake)
    g_loss_sum = tf.summary.scalar("g_loss", self.g_loss)
    d_loss_sum = tf.summary.scalar("d_loss", self.d_loss)
    self.g_sum = tf.summary.merge([z_sum, d__sum, g_sum, d_loss_fake_sum, g_loss_sum])
    self.d_sum = tf.summary.merge([z_sum, d_sum, d_loss_real_sum, d_loss_sum])

    self.saver = tf.train.Saver()
    self.writer = tf.summary.FileWriter("./logs", self.sess.graph)
    上面的代码就是定义损失函数和判别函数,构建模型,后面两个函数对抗生成。

对抗神经网络算法改进 对抗神经网络生成图片_tensorflow_07


运行DCGAN_class.py,程序输出如下:

对抗神经网络算法改进 对抗神经网络生成图片_深度学习_08


等到训练到设定的步数后,在程序目录下就会生成图片和保存的模型了。

对抗神经网络算法改进 对抗神经网络生成图片_机器学习_09


我设置的是每50步生成一张图片,随着训练次数不断增加,图片的效果越来越好。

对抗神经网络算法改进 对抗神经网络生成图片_机器学习_10


以上就是我所实验的情况,当然要生成更好的效果图片还要加大训练次数。