Ø一个知识点,一个案例,一段代码,理论与实践结合
Ø通俗简单易懂,每个案例代码都非常简短.
Ø代码注解非常清楚
Ø系统化学习,包括编程,数学,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
领取专属 10元无门槛券
私享最新 技术干货