WGAN-GP与GAN及WGAN的比较

匿名 (未验证) 提交于 2019-12-03 00:34:01











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()  


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!