人工智能学习案例-生成对抗神经网络案例

Ø一个知识点,一个案例,一段代码,理论与实践结合

Ø通俗简单易懂,每个案例代码都非常简短.

Ø代码注解非常清楚

Ø系统化学习,包括编程,数学,numpy,tensorflow,matplotlib

让大家更快,更好的掌握人工智能

花两小时改变自己的命运

GAN 主要包括了两个部分,即生成器 generator 与判别器 discriminator。生成器主要用来学习真实图像分布从而让自身生成的图像更加真实,以骗过判别器。判别器则需要对接收的图片进行真假判别。在整个过程中,生成器努力地让生成的图像更加真实,而判别器则努力地去识别出图像的真假,这个过程相当于一个二人博弈,随着时间的推移,生成器和判别器在不断地进行对抗,最终两个网络达到了一个动态均衡:生成器生成的图像接近于真实图像分布,而判别器识别不出真假图像,对于给定图像的预测为真的概率基本接近 0.5(相当于随机猜测类别)。

""" 生成对抗网络 (GAN).

用生成对抗网络去生成数字图片,来自噪音分布

Links:

- [GAN 论文下载](https://arxiv.org/pdf/1406.2661.pdf).

- [MNIST 数据集下载地址](http://yann.lecun.com/exdb/mnist/).

- [Xavier Glorot Init](www.cs.cmu.edu/~bhiksha/courses/deeplearning/Fall.../AISTATS2010_Glorot.pdf).

"""

from__future__importdivision, print_function, absolute_import

importmatplotlib.pyplotasplt

importnumpyasnp

importtensorflowastf

# 导入mnist数据

fromtensorflow.examples.tutorials.mnistimportinput_data

mnist=input_data.read_data_sets("/tmp/data/",one_hot=True)

# 训练参数 训练轮数

num_steps=100000

#每批数据大小

batch_size=128

#学习率

learning_rate=0.0002

# 神经网络参数

#图像维度 28*28像素

image_dim=784

#生成器隐藏维度

gen_hidden_dim=256

#判别器隐藏维度

disc_hidden_dim=256

#噪声数据维度

noise_dim=100

# 自定义初始化

defglorot_init(shape):

returntf.random_normal(shape=shape,stddev=1./tf.sqrt(shape[]/2.))

#权重值

weights={

'gen_hidden1':tf.Variable(glorot_init([noise_dim, gen_hidden_dim])),

'gen_out':tf.Variable(glorot_init([gen_hidden_dim, image_dim])),

'disc_hidden1':tf.Variable(glorot_init([image_dim, disc_hidden_dim])),

'disc_out':tf.Variable(glorot_init([disc_hidden_dim,1])),

}

#偏置值

biases={

'gen_hidden1':tf.Variable(tf.zeros([gen_hidden_dim])),

'gen_out':tf.Variable(tf.zeros([image_dim])),

'disc_hidden1':tf.Variable(tf.zeros([disc_hidden_dim])),

'disc_out':tf.Variable(tf.zeros([1])),

}

# 构建生成器

defgenerator(x):

hidden_layer=tf.matmul(x, weights['gen_hidden1'])

hidden_layer=tf.add(hidden_layer, biases['gen_hidden1'])

hidden_layer=tf.nn.relu(hidden_layer)

out_layer=tf.matmul(hidden_layer, weights['gen_out'])

out_layer=tf.add(out_layer, biases['gen_out'])

out_layer=tf.nn.sigmoid(out_layer)

returnout_layer

# 构建判别器

defdiscriminator(x):

hidden_layer=tf.matmul(x, weights['disc_hidden1'])

hidden_layer=tf.add(hidden_layer, biases['disc_hidden1'])

hidden_layer=tf.nn.relu(hidden_layer)

out_layer=tf.matmul(hidden_layer, weights['disc_out'])

out_layer=tf.add(out_layer, biases['disc_out'])

out_layer=tf.nn.sigmoid(out_layer)

returnout_layer

# 构建神经网络

# 生成器输入参数

gen_input=tf.placeholder(tf.float32,shape=[None, noise_dim],name='input_noise')

#判别器输入参数

disc_input=tf.placeholder(tf.float32,shape=[None, image_dim],name='disc_input')

# 构建生成器网络

gen_sample=generator(gen_input)

#生成真的判别器网络

disc_real=discriminator(disc_input)

# 生成假的判别器网络

disc_fake=discriminator(gen_sample)

#生成器损失

gen_loss= -tf.reduce_mean(tf.log(disc_fake))

#判别器损失

disc_loss= -tf.reduce_mean(tf.log(disc_real)+tf.log(1.-disc_fake))

# 生成器优化

optimizer_gen=tf.train.AdamOptimizer(learning_rate=learning_rate)

#判别器优化

optimizer_disc=tf.train.AdamOptimizer(learning_rate=learning_rate)

#为每一个优化器定义训练变量

#在TensorFlow默认情况下,所有变量都由每个优化器更新,所以我们

#需要精确地对它们中的每一个变量进行更新。

# 生成器网络变量

gen_vars=[weights['gen_hidden1'], weights['gen_out'],

biases['gen_hidden1'], biases['gen_out']]

#判别器网络变量

disc_vars=[weights['disc_hidden1'], weights['disc_out'],

biases['disc_hidden1'], biases['disc_out']]

# 训练生成器

train_gen=optimizer_gen.minimize(gen_loss,var_list=gen_vars)

#训练判别器

train_disc=optimizer_disc.minimize(disc_loss,var_list=disc_vars)

#初始化所有变量

init=tf.global_variables_initializer()

# 开始训练

withtf.Session()assess:

# 执行初始化

sess.run(init)

foriinrange(1, num_steps+1):

# 准备数据

# 获取下一批MNIST data

batch_x, _=mnist.train.next_batch(batch_size)

# 生成噪声数据去喂养生成器

z=np.random.uniform(-1.,1.,size=[batch_size, noise_dim])

# 构建喂养数据

feed_dict=

#执行训练

_, _, gl, dl=sess.run([train_gen, train_disc, gen_loss, disc_loss],

feed_dict=feed_dict)

ifi%1000==ori==1:

print('Step %i: 生成器损失: %f, 判别器损失: %f'%(i, gl, dl))

#用生成器网络生成图片

#生成一个4*10的子图,可同时排列展示4*10张图片

f, a=plt.subplots(4,10,figsize=(10,4))

foriinrange(10):

# 随机均匀产生噪声数据

z=np.random.uniform(-1.,1.,size=[4, noise_dim])

#生成器生成图片

g=sess.run([gen_sample],feed_dict=)

#修改维度

g=np.reshape(g,newshape=(4,28,28,1))

# 为了更好显示反转颜色

g= -1*(g-1)

forjinrange(4):

# 根据噪声生成图像,为了在 matplot显示,扩展到三个通道

img=np.reshape(np.repeat(g[j][:,:, np.newaxis],3,axis=2),

newshape=(28,28,3))

#设置子图要显示的图片

a[j][i].imshow(img)

f.show()

#将这些子图画在画板上

plt.draw()

plt.waitforbuttonpress()

生成假数据:

输出结果:

Step 1:生成器损失: 0.947410,判别器损失: 1.301169

Step 1000:生成器损失: 3.752364,判别器损失: 0.065769

Step 2000:生成器损失: 4.571978,判别器损失: 0.041604

Step 3000:生成器损失: 5.512800,判别器损失: 0.011526

Step 4000:生成器损失: 3.587130,判别器损失: 0.093961

Step 5000:生成器损失: 3.479909,判别器损失: 0.160374

Step 6000:生成器损失: 3.751514,判别器损失: 0.172857

Step 7000:生成器损失: 4.398063,判别器损失: 0.102757

Step 8000:生成器损失: 3.561379,判别器损失: 0.144500

Step 9000:生成器损失: 3.113562,判别器损失: 0.228384

Step 10000:生成器损失: 3.375835,判别器损失: 0.227730

Step 11000:生成器损失: 2.973153,判别器损失: 0.303473

Step 12000:生成器损失: 3.552670,判别器损失: 0.300599

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180520G15U8C00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券