GAN实现(含python代码)
目录
伪代码
上图是伪代码。
设置初始数据的分布和生成器的初始化分布
import numpy as np
#高斯分布
class DataDistribution(object):
def __init__(self):
self.mu=3
self.sigma=0.5
def sample(self,N):
samples=np.random.normal(self.mu,self.sigma,N)
samples.sort()
return samples
samples=DataDistribution().sample(3)
print (samples)
# 生成器的初始化分布为平均分布
class CeneratorDistribution(object):
def __init__(self):
self.range=range
def sample(self,N):
return np.linspace(-self.range,self.range,N)+ np.random.random(N)*0.01
generator=CeneratorDistribution()
generator.range=6
generator=generator.sample(2)
print (generator)
结果如下,这里主要是了解python 类 的调用
设置简单的线性运算用于后面的生成器与判别器
线性函数用于很后面的生成器与判别器
def linear(input,output_dim,scope=None,stddev=1.0):
"""
:param input: 输入
:param output_dim:输出尺寸
:param scope:
:param stddev: 标准偏差
:return:
"""
norm=tf.random_normal_initializer(stddev=stddev)
const=tf.const_initializer(0.0)
with tf.variable_scope(scope or 'linear'):
w=tf.get_variable('w',[input.get_shape()[1],output_dim],intializer=norm)
b=tf.get_variable('b',[output_dim],intializer=const)
return tf.matmul(input,w)+b
简单的生成器和判别器代码
def generator(input,h_dim):
h0=tf.nn.softblus(linear(input,h_dim,'g0'))
h1=linear(h0,1,'g1')
return h1
def discriminator(input,h_dim):
h0=tf.tanh(linear(input,h_dim*2,'d0'))
h1=tf.tanh(linear(h0,h_dim*2,'d1'))
h2=tf.tanh(linear(input,h_dim*2,'d2'))
h3=tf.tanh(linear(input,h_dim*2,'d3'))
return h3
优化器,使用学习率衰减的梯度下降,这里要解释一下学习率衰减的梯度下降算法
学习率衰减的梯度下降算法
在梯度下降算法中我们是希望找到极值点,学习率大的话,梯度变化太快容易错过极值点,梯度下降过慢就会训练特别慢,浪费时间,这就要在远离极值点的时候学习率大一点,靠近极值点的时候学习率小一点,到达极值点的时候不再下降。
def optimizer(loss,var_list,initial_learning_rate):
"""
:param loss:
:param var_list:
:param initial_learning_rate: 初始学习率
:return:
"""
# 衰退值
decay=0.95
#衰退步长
num_decay_steps=150
#将训练batch初始为0
batch=tf.Variable(0)
#训练指数衰减
learning_rate=tf.train.exponential_decay(
initial_learning_rate,
batch,
num_decay_steps,
decay,
#如果为true,即楼梯为真,说明学习率要向楼梯一样下降;
staircase=True
)
optimizer=tf.trian.GradientDescentOptimizer(learning_rate).minimize(
loss,
global_step=batch,
var_list=var_list
)
return optimizer()
以上代码分为两步,第一步是先计算学习率,然后用学斜率进行学习率最小优化
图像编辑和着色,风格装换,物体变形,照片增强
弥补监督学习和无监督学习之间的空隙
监督学习就是预测数据与标签之间的关联关系,目标是对没有见过的数据也有很好预测效果
但是在现实中标记数据是非常耗费资源的,在非监督学习中,数据没有被标记,目标通常不是对新数据产生预测
在生成对抗网络中,通过生成伪造的,合成的数据并尝试判断生成样本真伪,这是采用监督学习方法去完成无监督学习任务。做分类任务的判别器四监督学习,但是GAN的目标是了解真实数据的分布或者密度,根据学到的知识生成新的数据。
条件GAN
GAN有两个网络
从未知分布或噪声中学习生成伪造样本的生成器
学习如何从样本中区分真伪的判别器
在条件GAN中,生成器是通过一个特定的条件或者某些特征(例如一个图像的标签或其他一些细节特征)学习如何生成伪造样本,如果给生成器和判别器加入一些条件,加入一个条件向量y,D(x,y)和G(z,y)都有一组联合向量
如图
利用CGAN生成时尚衣柜
定义一个输入变量来保存条件
Y=tf.placeholder(tf.float32,shape=None,num_labels)
把新的变量y和判别器D(x)与G(z)结合
Dihidden=256 #判别器隐藏单元
Ghidden=512 生成器隐藏单元
K=8 判别器的最大输出单元
判别器网络
def discriminator(x,y):
u=tf.reshape(tf.matmul(x,DW1x)+tf.matmul(y,DW1y)+Db1,[-1,K,Dihhiden])
Dh1=tf.nn.dropout(tf.reduce_max(u,reduction_indices=[1],keep_prob))
return tf.nn.sigmoid(tf.matmul(Dh1,Dw2)+Db2)
生成器网络
def generator:
Gh1=tf.reshape(tf.matmul(Z,GW1z)+tf.matmul(Y,GW1y)+Gb1)
G=tf.nn.sigmoid(tf.matmul(Gh1,GW2)+Gb2)
return G
###定义损失函数
G_simple=generator(Z,Y)
DG=discriminator(G_simple,Y)
Dloss=-tf.reduce_mean(tf.log(discriminator(X,Y)+tf.log(1-DG)))
Gloss=tf.reduce_mean(tf.log(1-DG)-tf.log(DG+1e-9))
在训练过程中,我们将y输出给生成器网络和判别器网络
x_mb,y_mb=mnist.train.next_batch(mini_batch_size)
z_sample=sample_Z(mini_batch_size,noise_dim)
_,D_loss_curr=sess.run([Doptimizer,Dloss],fees_dict={X:X_mb,Z:Z_sample,Y:y_mb,keep_prob:0.5})
,G_loss_curr=sess.run([Goptimizer,Gloss],feed_dict={Z:Z_sample,Y:y_mb,keep_prob:1.0})
在本例中,我们使用图像标签作为条件,并选择标签值为7,也就是生成运动鞋的图像
条件变量y_sample是一个单热编码的向量,只是在索引为7的位置是1,在其他位置都是0
nsamples=6
Z_sample=sample_Z(nsamples,noise_dim)
y_sample=np.zeros(shape=[nsamples,num_labels])
y_sample[:7]=1
samples=sess.run(G_sample.,feed_dict={Z_sample,Y:y_sample})
来源:Nefelibat