本文主要是介绍【Tensorflow tf 掏粪记录】笔记四——tensorflow搭建GAN神经网络,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
GAN,对抗神经网络。简单通俗的说就是类似老顽童的左右互博术这种东西。机器试图自己打败自己,毕竟世界上最大的敌人是自己。哈哈哈哈。
2018/3/31 18:35 pm
下面是我最新训练生成的结果,网络深度为512,个别的类似3,5,2的复杂的数我是用1024深的网络指定标签针对训练的。
简要介绍GAN
GAN神经网络主要就是在网络中有一个生成器(Generator)一个鉴别器(Discriminator),鉴别器鉴别真假以及预测标签。生成器则生成目标文件送去鉴别器鉴别。生成器努力生成鉴别器无法鉴别出为假的文件,鉴别器努力的试图鉴别出来送检的假货。然后就他们两个不断的对抗,就像炼蛊一样。
项目结构
这次的项目中主要有3个文件。使用的是MNIST数据集
config.yam
:
- 用来设置各种类似学习率(learning_rate), Leaky Relu所使用的alpha,迭代次数(epoch)等。我们可以指定训练的图像的标签。比如说可以单独训练标签为‘8’的数据,并生成类似‘8’的数据。方便我们调参。
train.py
:
- 放置训练使用的代码与神经网络。这里我是用了tensorboard,tensorboard将会把生成器(Generator)的loss与鉴别器(Discriminator)的loss分别展示到tensorboard中。我们可以在训练的过程中实时观察各个loss的走势。以及我把每次生成器(Generator)生成的图片都保存在了硬盘中,我们也可以实时的观察机器学习的成果。
utils.py
:
- 放置组成神经网络,预处理数据等
train.py
中需要用到的工具。例如data_batch()
等。
- 放置组成神经网络,预处理数据等
Utils工具
生成器(Generator)
生成器我用的是全连接神经网络,因为MNIST数据集十分的简单,全连接神经网络的表现已经十分的优秀了。当然卷积也行,看个人喜好。
因为tensorflow中没有Leaky Relu函数,所以需要自己实现。所以tf.layer.dense()
中的activation = None
我不希望它自动调用了其他激活函数。
最后的激活函数我调用tf.tanh()
。
我把这段代码中的变量命名为‘generator’,为了方便我日后根据变量名保存变量。从而实现只保存生成器,丢弃鉴别器。
def generator( z, out_dim, n_units = 128, reuse = False, alpha = 0.01 ):with tf.variable_scope( 'generator', reuse = reuse ): #命名闭包中代码的变量h1 = tf.layers.dense( z, n_units, activation = None ) # 声明全连接神经网络h1 = tf.maximum( alpha * h1, h1 ) # Leaky Relulogits = tf.layers.dense( h1, out_dim, activation = None )out = tf.tanh( logits )return out
鉴别器(Discriminator)
分类器用的激活函数也是Leaky Relu函数。结构跟生成器(Generator)类似,只不过最后的一层的激活函数换成了,而且最一层全连接层的神经元数我只设置了一个,因为我发现tf.sigmoid()
tf.sigmoid()
激活函数并没有对模型有很大的帮助。
同样的我也为这段代码中的变量命名了。
def discriminator( x, n_units = 128, reuse = False, alpha = 0.01 ):with tf.variable_scope( 'discriminator', reuse = reuse ):h1 = tf.layers.dense( x, n_units, activation = None ) # Leacy ReLUh1 = tf.maximum( alpha * h1, h1 )logits = tf.layers.dense( h1, 1, activation = None )out = tf.sigmoid( logits )return out, logits
tr
这篇关于【Tensorflow tf 掏粪记录】笔记四——tensorflow搭建GAN神经网络的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!