GAN实现(含python代码)

目录

  • 伪代码
  • 设置初始数据的分布和生成器的初始化分布
  • 设置简单的线性运算用于后面的生成器与判别器
  • 线性函数用于很后面的生成器与判别器
  • 简单的生成器和判别器代码
  • 学习率衰减的梯度下降算法
  • 弥补监督学习和无监督学习之间的空隙
  • 条件GAN
  • 利用CGAN生成时尚衣柜
  • 判别器网络
  • 生成器网络
  • 在训练过程中,我们将y输出给生成器网络和判别器网络
  • 在本例中,我们使用图像标签作为条件,并选择标签值为7,也就是生成运动鞋的图像
  • 伪代码


    上图是伪代码。

    设置初始数据的分布和生成器的初始化分布

    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

    物联沃分享整理
    物联沃-IOTWORD物联网 » GAN实现(含python代码)

    发表评论