WGAN-GP精彩分析(附源代码)

匆匆过客 提交于 2019-12-05 10:54:02

转载自:https://www.e-learn.cn/content/qita/814071

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

from datetime import datetime  
import os  
import matplotlib.pyplot as plt  
import numpy as np  
import tensorflow as tf  
from six.moves import xrange  
data = np.load('final37.npy')  
data = data[:,:,0:60]  
#显示原始数据图像  
def Show_images(data,show_nums,save=False):  
    index = 0  
    for n in range(show_nums):  
        show_images = data[index:index+100]  
        show_images = show_images.reshape(100,3,60,1)  
        r,c = 10,10  
        fig,axs = plt.subplots(r,c)  
        cnt = 0  
        for i in range(r):  
            for j in range(c):  
                xy = show_images[cnt]  
                for k in range(len(xy)):  
                    x = xy[k][0:30]  
                    y = xy[k][30:60]  
                    if k == 0 :  
                        axs[i,j].plot(x,y,color='blue',linewidth=2)  
                    if k == 1:  
                        axs[i,j].plot(x,y,color='red',linewidth=2)  
                    if k == 2:  
                        axs[i,j].plot(x,y,color='green',linewidth=2)  
                        axs[i,j].axis('off')  
                cnt += 1  
        index += 100  
        if save:  
            if not os.path.exists('This_epoch'):  
                os.makedirs('This_epoch')  
            fig.savefig('This_epoch/%d.jpg' % n)  
            plt.close()  
        else:  
            plt.show()  
              
def Save_genImages(gen, epoch):  
    r,c = 10,10  
    fig,axs = plt.subplots(r,c)  
    cnt = 0  
    for i in range(r):  
        for j in range(c):  
            xy = gen[cnt]  
            for k in range(len(xy)):  
                x = xy[k][0:30]  
                y = xy[k][30:60]  
                if k == 0:  
                    axs[i,j].plot(x,y,color='blue')  
                if k == 1:  
                    axs[i,j].plot(x,y,color='red')  
                if k == 2:  
                    axs[i,j].plot(x,y,color='green')  
                    axs[i,j].axis('off')  
            cnt += 1  
    if not os.path.exists('gen_img1'):  
        os.makedirs('gen_img1')  
    fig.savefig('gen_img1/%d.jpg' % epoch)  
    plt.close()  
def Save_lossValue(epoch,iters,d_loss,g_loss):  
    with open('losst.txt','a') as f:  
        f.write("第%d个epoch,第%d个batch , d_loss: %.8f, g_loss: %.8f"%(epoch, iters, d_loss, g_loss)+'\n')  
def plot_loss(loss):  
    fig,ax = plt.subplots(figsize=(20,7))  
    losses = np.array(loss)  
    plt.plot(losses.T[0], label="Discriminator Loss")  
    plt.plot(losses.T[1], label="Generator Loss")  
    plt.title("Training Losses")  
    plt.legend()  
    plt.savefig('loss.jpg')  
    plt.show()  
#定义Relu激活函数  
def Relu(name, tensor):  
    return tf.nn.relu(tensor,name)  
  
#定义LeakyRelu激活函数  
def LeakyRelu(name, x, leak=0.2):  
    return tf.maximum(x,leak*x,name=name)  
  
#定义全连接层  
def Fully_connected(name, value, output_shape):  
    with tf.variable_scope(name,reuse=None) as scope:  
        shape = value.get_shape().as_list()  
        w = tf.get_variable('w',[shape[1],output_shape],dtype=tf.float32,  
                            initializer=tf.random_normal_initializer(stddev=0.01))  
        b = tf.get_variable('b',[output_shape],dtype=tf.float32,initializer=tf.constant_initializer(0.0))  
          
        return tf.matmul(value,w) + b  
      
#定义一维卷积  
def Conv1d(name, tensor, ksize, out_dim, stride, padding, stddev=0.01):  
    with tf.variable_scope(name):  
        w = tf.get_variable('w',[ksize,tensor.get_shape()[-1],out_dim],dtype=tf.float32,  
                            initializer=tf.random_normal_initializer(stddev=stddev))  
        var = tf.nn.conv1d(tensor,w,stride,padding=padding)  
        b = tf.get_variable('b',[out_dim],'float32',initializer=tf.constant_initializer(0.01))  
          
        return tf.nn.bias_add(var,b)  
      
#定义二维卷积  
def Conv2d(name, tensor, filter_size1 ,filter_size2, out_dim, stride1, stride2, padding, stddev=0.01):  
    with tf.variable_scope(name):  
        w = tf.get_variable('w',[filter_size1, filter_size2, tensor.get_shape()[-1], out_dim], dtype=tf.float32,  
                            initializer=tf.random_normal_initializer(stddev=stddev))  
        var = tf.nn.conv2d(tensor, w, [1, stride1, stride2, 1], padding=padding)  
        b = tf.get_variable('b',[out_dim], 'float32', initializer=tf.constant_initializer(0.01))  
          
        return tf.nn.bias_add(var,b)  
      
#定义二维反卷积  
def Deconv2d(name, tensor, filter_size1, filter_size2, outshape, stride1, stride2, padding, stddev=0.01):  
    with tf.variable_scope(name):  
        w = tf.get_variable('w', [filter_size1, filter_size2, outshape[-1], tensor.get_shape()[-1]], dtype=tf.float32,  
                                 initializer=tf.random_normal_initializer(stddev=stddev))  
        var = tf.nn.conv2d_transpose(tensor, w, outshape, strides=[1,stride1, stride2, 1], padding=padding)  
        b = tf.get_variable('b', [outshape[-1]],'float32', initializer=tf.constant_initializer(0.01))  
          
        return tf.nn.bias_add(var,b)  
def Get_inputs(real_size,noise_size):  
        real_img = tf.placeholder(tf.float32, [None, real_size], name='real_img')  
        noise_img = tf.placeholder(tf.float32, [None, noise_size], name='noise_img')  
          
        return real_img, noise_img  
      
def Generator(noise_img, reuse=False, alpha=0.01):  
    with tf.variable_scope('generator',reuse=reuse):  
#         print(noise_img.shape)  
        output = tf.layers.dense(noise_img,128)  
#         print(output.shape)  
        output = tf.maximum(alpha * output,output)  
        output = tf.layers.batch_normalization(output,momentum=0.8,training=True)  
        output = tf.layers.dropout(output, rate=0.25)  
          
        output = tf.layers.dense(output,512)  
        output = tf.maximum(alpha * output,output)  
        output = tf.layers.batch_normalization(output,momentum=0.8,training=True)  
        output = tf.layers.dropout(output,rate=0.25)  
          
        output = tf.layers.dense(output,180)  
        output = tf.tanh(output)  
        return output  
def Discriminator(img,reuse=False,alpha=0.01):  
      
    with tf.variable_scope("discriminator", reuse=reuse):  
        print(img.shape)  
        output = tf.layers.dense(img,512)  
        output = tf.maximum(alpha * output, output)  
          
        output = tf.layers.dense(output,128)  
        output = tf.maximum(alpha * output, output)  
          
        output = tf.layers.dense(output,1)  
        return output  
mode = 'gan' #gan, wgan, wgan-gp     
batch_size = 100  
epochs = 1  
n_sample = 100  
learning_rate = 0.0002  
lamda = 10  
img_size  = 180  
noise_size = 100  
  
tf.reset_default_graph()  
  
real_img, noise_img = Get_inputs(img_size,noise_size)#feed于此  
real_data = real_img  
fake_data = Generator(noise_img)  
  
disc_real = Discriminator(real_data,reuse=False)  
disc_fake = Discriminator(fake_data,reuse=True)  
  
  
#生成器和判别器中的tensor  
train_vars = tf.trainable_variables()  
g_vars = [var for var in train_vars if var.name.startswith("generator")]  
d_vars = [var for var in train_vars if var.name.startswith("discriminator")]  

#普通的GAN
if mode == 'gan':
    gen_cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=disc_fake,labels=tf.ones_like(disc_fake))) #生成器loss
    disc_cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=disc_fake,labels=tf.zeros_like(disc_fake)))
    disc_cost += tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=disc_real,labels=tf.ones_like(disc_real)))
    disc_cost /= 2. #判别器loss
    #优化器
    gen_train_op = tf.train.AdamOptimizer(learning_rate=2e-4, beta1=0.5).minimize(gen_cost,var_list=g_vars)
    disc_train_op = tf.train.AdamOptimizer(learning_rate=2e-4,beta1=0.5).minimize(disc_cost,var_list=d_vars)
    clip_disc_weights = None
    
#wgan
elif mode == 'wgan':
    gen_cost = -tf.reduce_mean(disc_fake) #生成器loss
    disc_cost = tf.reduce_mean(disc_fake) - tf.reduce_mean(disc_real) #判别器loss
    
    #优化器
    gen_train_op = tf.train.RMSPropOptimizer(learning_rate=5e-5).minimize(gen_cost,var_list=g_vars)
    disc_train_op = tf.train.RMSPropOptimizer(learning_rate=5e-5).minimize(disc_cost,var_list=d_vars)
    clip_ops = []
    #将判别器权重截断到[-0.01,0.01]
    for var in train_vars:
        if var.name.startswith("discriminator"):
            clip_bounds = [-0.01, 0.01]
            clip_ops.append(tf.assign(var,tf.clip_by_value(var,clip_bounds[0],clip_bounds[1])))
    clip_disc_weights = tf.group(*clip_ops)
    
elif mode == 'wgan-gp':
    gen_cost = -tf.reduce_mean(disc_fake) #生成器loss  
    disc_cost = tf.reduce_mean(disc_fake) - tf.reduce_mean(disc_real) #判别器loss 
       
    #梯度惩罚
    alpha = tf.random_uniform(shape=[batch_size,1],minval=0.,maxval=1.)  
    interpolates = alpha*fake_data + (1-alpha)*real_data  
    gradients = tf.gradients(Discriminator(interpolates,reuse=True),[interpolates])[0]  
    slopes = tf.sqrt(tf.reduce_sum(tf.square(gradients),reduction_indices=[1]))  
    gradient_penalty = tf.reduce_mean((slopes-1.)**2)  
    disc_cost += lamda * gradient_penalty  
    clip_disc_weights = None
  
    #优化器  
    gen_train_op = tf.train.AdamOptimizer(learning_rate=1e-4,beta1=0.5,beta2=0.9).minimize(gen_cost,var_list=g_vars)  
    disc_train_op = tf.train.AdamOptimizer(learning_rate=1e-4,beta1=0.5,beta2=0.9).minimize(disc_cost,var_list=d_vars)  
  
saver = tf.train.Saver()  
def Train():  
    losses = []  
    with tf.Session() as sess:  
        sess.run(tf.global_variables_initializer())  
        for e in range(epochs):  
            for i in xrange(len(data)//batch_size):  
                batch_images = data[i*batch_size:(i+1)*batch_size]  
                batch_images = batch_images.reshape(batch_size,180)  
                batch_images = batch_images*2 -1   
                batch_noise = np.random.uniform(-1,1,size=(batch_size,noise_size))
                if mode == 'gan': #普通的gan,判别器,生成器各训练一次
                    disc_iters = 2
                else:             #wgan和wgan-gp,判别器训练多次,生成器训练一次
                    disc_iters = 2  
                for x in range(0,disc_iters):  
                    _,d_loss = sess.run([disc_train_op,disc_cost],feed_dict={real_data:batch_images,noise_img:batch_noise}) 
                    if clip_disc_weights is not None:
                        _ = sess.run(clip_disc_weights) 
                _,g_loss = sess.run([gen_train_op,gen_cost],feed_dict={noise_img:batch_noise})  
                Save_lossValue(e,i,d_loss,g_loss)  
                print("第%d个epoch,第%d个batch , d_loss: %.8f, g_loss: %.8f"%(e, i, d_loss, g_loss))  
                losses.append((d_loss,g_loss))  
            sample_noise = np.random.uniform(-1,1,size=(100,100))  
            gen_samples = sess.run(Generator(noise_img,reuse=True),feed_dict={noise_img:sample_noise})  
            print(gen_samples.shape)  
            saver.save(sess,'checkpoints/test.ckpt')  
            if e % 1 == 0:  
                gen = gen_samples.reshape(100,3,60,1)  
                Save_genImages(gen, e)  
        plot_loss(losses)               
  
def Test():  
    saver = tf.train.Saver(var_list=g_vars)  
    with tf.Session() as sess:  
        saver.restore(sess,tf.train.latest_checkpoint("checkpoints"))  
#         saver.restore(sess,'checkppoints/b.ckpt')  
        sample_noise = np.random.uniform(-1, 1, size=(10000,noise_size))  
        gen_samples = sess.run(Generator(noise_img,reuse=True),feed_dict={noise_img:sample_noise})  
        gen_images = (gen_samples+1)/2  
        show_num = len(gen_images)//100  
        Show_images(gen_images,show_num,save=True)  
  
if __name__ == '__main__':  
    Train()  
    #Test()  
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!