对抗生成网络及代码实例

来源:互联网 发布:如何开启3724端口 编辑:程序博客网 时间:2024/06/17 22:32

1 概述

Gererative Adversarial Networks最早由Goodfellow Ian在2014年发表论文提出。论文地址:https://arxiv.org/abs/1406.2661。
定义:由两个相互博弈的神经网络组成的判别-生成模型。两个神经网络一个是生成网络G,一个是判别网络D。博弈的目的是使生成网络生成的数据更真,判别网络判别能力越强。通俗理解就是最小化生成网络生成的数据和真实数据集的概率分布,最大化判别网络的区分度。GAN属于无监督学习。

概念理解小例子:假币和真币
犯罪分子造假币,是G。银行判别假币,是D
真的标签为1,假的标签为0,我们要做的是:
当输入D的人民币为真的时候,就打上标签1
当输入D的人民币为假的时候,就打上标签0
G生成的人民币,输入到D中,希望打上标签1

应用: GAN有广泛的应用,它可以用来生成以假乱真的图片,也可以生成视频,三维物体模型等。并且已经有人把它应用到NLP上了。论文地址:https://arxiv.org/pdf/1609.05473.pdf

2 组成

2.1 G网络

输入和输出:是噪音数据,输出是我们想要的分布数据,比如一张人脸图片的数据。
策略: G网络的训练策略是让D(G(z))趋近于1。
损失函数:是ln(1-D(G(z))),训练目的是希望D(G(z))趋近于1。这样G的loss就会最小

2.2 D网络

输入和输出:网络的输入则混合G的输入数据以及样本数据,输出是一个二分类,或者概率值。
策略: D网络的训练的策略是让D(G(z))趋近于0。
注意最后的目的不是让D(G(z))趋近于0,最后的目的是让D(G(z))趋近于0.5。1/(1+1) = 0.5。上面的1代表真实数据的分布,下面的1代表真实数据的分布和生成数据的分布。
损失函数: ln(D(x)) + ln(1-D(G(z))),注意这里并不是交叉熵函
左边当数据是真实数据时,判别完等于1,希望D(x)趋近于1。右边希望D(G(z))等于0。模型接收的数据可能是真实数据或者生成数据。

3 特点

1)去掉全连接的隐藏层
2)去掉了G网络和D网络中的pooling层
3)在G网络中除最后一层使用RELU,最后一层使用Tanh(双曲正切函数)
4)在D网络中每一层使用LeakyRELU
5)在G网络和D网络中都使用Batch Normalization

4 示例

构建一个简单对抗生成模型,使生成网络能够生成一个位于已知图形之间的图形,并且尽量拟合已知图形。
已知图形如下:

首先看一下训练效果 下图依次是迭代50次,500次,5000次的效果

代码地址:https://github.com/MorvanZhou/Tensorflow-Tutorial/blob/master/tutorial-contents/406_GAN.py

代码解读:
1)构建生成网络

with tf.variable_scope('Generator'):G_in = tf.placeholder(tf.float32, [None, N_IDEAS])          # random ideas (could from normal distribution)G_l1 = tf.layers.dense(G_in, 128, tf.nn.relu)G_out = tf.layers.dense(G_l1, ART_COMPONENTS)   

2)构建判别网络

with tf.variable_scope('Discriminator'):real_art = tf.placeholder(tf.float32, [None, ART_COMPONENTS], name='real_in')   # receive art work from the famous artistD_l0 = tf.layers.dense(real_art, 128, tf.nn.relu, name='l')prob_artist0 = tf.layers.dense(D_l0, 1, tf.nn.sigmoid, name='out')              # probability that the art work is made by artist# reuse layers for generatorD_l1 = tf.layers.dense(G_out, 128, tf.nn.relu, name='l', reuse=True)            # receive art work from a newbie like Gprob_artist1 = tf.layers.dense(D_l1, 1, tf.nn.sigmoid, name='out', reuse=True)  # probability that the art work is made by artist

3)训练

train_D = tf.train.AdamOptimizer(LR_D).minimize(    D_loss, var_list=tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='Discriminator'))train_G = tf.train.AdamOptimizer(LR_G).minimize(    G_loss, var_list=tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='Generator'))