程式設計師實戰,生成式對抗網絡(GAN)下篇,tensorflow實現

2021-01-07 ai昂鈦客angtk

一、程序代碼

程序主要實現上篇文章中所提到的隨機噪聲擬合高斯分布的過程,話不多說,直接上代碼:

#引入必要的包import argparseimport numpy as npfrom scipy.stats import normimport tensorflow as tfimport matplotlib.pyplot as pltimport seaborn as snssns.set(color_codes=True)#設置種子,用於隨機初始化seed =42np.random.seed(seed)tf.set_random_seed(seed)#定義真實的數據分布,這裡為高斯分布classDataDistribution(object):def __init__(self):#高斯分布參數#均值為4self.mu =4#標準差為0.5self.sigma =0.5def sample(self, N): samples = np.random.normal(self.mu,self.sigma, N) samples.sort()return samples#隨機初始化一個分布,做為G網絡的輸入classGeneratorDistribution(object):def __init__(self, range):self.range = rangedef sample(self, N):return np.linspace(-self.range,self.range, N)+ \ np.random.random(N)*0.01#定義線性運算函數,其中參數output_dim=h_dim*2=8def linear(input, output_dim, scope=None, stddev=1.0):#定義一個隨機初始化 norm = tf.random_normal_initializer(stddev=stddev)#b初始化為0const= tf.constant_initializer(0.0)with tf.variable_scope(scope or'linear'):#聲明w的shape,輸入為(12,1)*w,故w為(1,8),w的初始化方式為高斯初始化 w = tf.get_variable('w',[input.get_shape()[1], output_dim], initializer=norm)#b初始化為常量 b = tf.get_variable('b',[output_dim], initializer=const)#執行線性運算return tf.matmul(input, w)+ b#def generator(input, h_dim): h0 = tf.nn.softplus(linear(input, h_dim,'g0')) h1 = linear(h0,1,'g1')return h1#初始化w和b的函數,其中h0,h1,h2,h3為層,將mlp_hidden_size=4傳給h_dimdef discriminator(input, h_dim):#linear 控制w和b的初始化,這裡linear函數的第二個參數為4*2=8#第一層 h0 = tf.tanh(linear(input, h_dim *2,'d0'))#第二層輸出,隱藏層神經元個數還是為8 h1 = tf.tanh(linear(h0, h_dim *2,'d1'))#h2為第三層輸出值 h2 = tf.tanh(linear(h1, h_dim *2, scope='d2'))#最終的輸出值 h3 = tf.sigmoid(linear(h2,1, scope='d3'))return h3#優化器 採用學習率衰減的方法def optimizer(loss, var_list, initial_learning_rate): decay =0.95 num_decay_steps =150 batch = tf.Variable(0)#調用學習率衰減的函數 learning_rate = tf.train.exponential_decay( initial_learning_rate, batch, num_decay_steps, decay, staircase=True)#梯度下降求解 optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize( loss, global_step=batch, var_list=var_list)#返回return optimizer#構造模型class GAN(object):def __init__(self, data, gen, num_steps, batch_size, log_every):self.data = dataself.gen = genself.num_steps = num_stepsself.batch_size = batch_sizeself.log_every = log_every#隱藏層神經元個數self.mlp_hidden_size =4#學習率self.learning_rate =0.03#通過placeholder格式來創造模型self._create_model()def _create_model(self):#創建一個名叫D_pre的域,先構造一個D_pre網絡,用來訓練出真正D網絡初始化網絡所需要的參數with tf.variable_scope('D_pre'):#輸入的shape為(12,1),一個batch一個batch的訓練,#每個batch的大小為12,要訓練的數據為1維的點self.pre_input = tf.placeholder(tf.float32, shape=(self.batch_size,1))self.pre_labels = tf.placeholder(tf.float32, shape=(self.batch_size,1))#調用discriminator來初始化w和b參數,其中self.mlp_hidden_size=4,為discriminator函數的第二個參數 D_pre = discriminator(self.pre_input,self.mlp_hidden_size)#預測值和label之間的差異self.pre_loss = tf.reduce_mean(tf.square(D_pre -self.pre_labels))#定義優化器求解self.pre_opt = optimizer(self.pre_loss,None,self.learning_rate)# This defines the generator network - it takes samples from a noise# distribution as input, and passes them through an MLP.#真正的G網絡with tf.variable_scope('Gen'):self.z = tf.placeholder(tf.float32, shape=(self.batch_size,1))#生產網絡只有兩層self.G = generator(self.z,self.mlp_hidden_size)# The discriminator tries to tell the difference between samples from the# true data distribution (self.x) and the generated samples (self.z).## Here we create two copies of the discriminator network (that share parameters),# as you cannot use the same network with different inputs in TensorFlow.#D網絡with tf.variable_scope('Disc')as scope:self.x = tf.placeholder(tf.float32, shape=(self.batch_size,1))#構造D1網絡,真實的數據self.D1 = discriminator(self.x,self.mlp_hidden_size)#重新使用一下變量,不用重新定義 scope.reuse_variables()#D2,生成的數據self.D2 = discriminator(self.G,self.mlp_hidden_size)# Define the loss for discriminator and generator networks (see the original# paper for details), and create optimizers for both#定義判別網絡損失函數self.loss_d = tf.reduce_mean(-tf.log(self.D1)- tf.log(1-self.D2))#定義生成網絡損失函數self.loss_g = tf.reduce_mean(-tf.log(self.D2))self.d_pre_params = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='D_pre')self.d_params = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='Disc')self.g_params = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='Gan')#優化,得到兩組參數self.opt_d = optimizer(self.loss_d,self.d_params,self.learning_rate)self.opt_g = optimizer(self.loss_g,self.g_params,self.learning_rate)def train(self):with tf.Session()as session: tf.global_variables_initializer().run()# pretraining discriminator#先訓練D_pre網絡 num_pretrain_steps =1000for step in range(num_pretrain_steps):#隨機生成數據 d =(np.random.random(self.batch_size)-0.5)*10.0 labels = norm.pdf(d, loc=self.data.mu, scale=self.data.sigma) pretrain_loss, _ = session.run([self.pre_loss,self.pre_opt],{self.pre_input: np.reshape(d,(self.batch_size,1)),self.pre_labels: np.reshape(labels,(self.batch_size,1))})#拿出預訓練好的數據self.weightsD = session.run(self.d_pre_params)# copy weights from pre-training over to new D networkfor i, v in enumerate(self.d_params): session.run(v.assign(self.weightsD[i]))#訓練真正的網絡for step in range(self.num_steps):# update discriminator x =self.data.sample(self.batch_size)#z是一個隨機生成的噪音 z =self.gen.sample(self.batch_size)#優化判別網絡 loss_d, _ = session.run([self.loss_d,self.opt_d],{self.x: np.reshape(x,(self.batch_size,1)),self.z: np.reshape(z,(self.batch_size,1))})# update generator#隨機初始化 z =self.gen.sample(self.batch_size)#迭代優化 loss_g, _ = session.run([self.loss_g,self.opt_g],{self.z: np.reshape(z,(self.batch_size,1))})#列印if step %self.log_every ==0:print('{}: {}\t{}'.format(step, loss_d, loss_g))#畫圖if step %100==0or step==0or step ==self.num_steps -1:self._plot_distributions(session)def _samples(self, session, num_points=10000, num_bins=100): xs = np.linspace(-self.gen.range,self.gen.range, num_points) bins = np.linspace(-self.gen.range,self.gen.range, num_bins)# data distribution d =self.data.sample(num_points) pd, _ = np.histogram(d, bins=bins, density=True)# generated samples zs = np.linspace(-self.gen.range,self.gen.range, num_points) g = np.zeros((num_points,1))for i in range(num_points // self.batch_size): g[self.batch_size * i:self.batch_size *(i +1)]= session.run(self.G,{self.z: np.reshape( zs[self.batch_size * i:self.batch_size *(i +1)],(self.batch_size,1))}) pg, _ = np.histogram(g, bins=bins, density=True)return pd, pgdef _plot_distributions(self, session): pd, pg =self._samples(session) p_x = np.linspace(-self.gen.range,self.gen.range, len(pd)) f, ax = plt.subplots(1) ax.set_ylim(0,1) plt.plot(p_x, pd, label='real data') plt.plot(p_x, pg, label='generated data') plt.title('1D Generative Adversarial Network') plt.xlabel('Data values') plt.ylabel('Probability density') plt.legend() plt.show()def main(args): model = GAN(#定義真實數據的分布DataDistribution(),#創造一些噪音點,用來傳入G函數GeneratorDistribution(range=8),#迭代次數 args.num_steps,#一次迭代12個點的數據 args.batch_size,#隔多少次列印當前loss args.log_every,) model.train()def parse_args(): parser = argparse.ArgumentParser() parser.add_argument('--num-steps', type=int,default=3000, help='the number of training steps to take') parser.add_argument('--batch-size', type=int,default=12, help='the batch size') parser.add_argument('--log-every', type=int,default=10, help='print loss after this many steps')return parser.parse_args()if __name__ =='__main__': main(parse_args())二、程序運行結果

1、程序運行初始狀態

其中左邊為隨機初始化的數據,右邊為真實的呈高斯分布的數據。

2、程序迭代運行1200次後的狀態

這裡不知道為什麼原因,程序沒有正常的擬合真實的數據,將迭代次數增加之後,程序也沒有太大的變化,D和G網絡的兩個Loss的變化都很小,這裡還望大家幫忙找一找原因。可能和GAN網絡容易訓練跑偏的一些原因有關。

留言,加入人工智慧深度學習社群,跟小編一起討論吧!

相關焦點

  • 程式設計師學習人工智慧,生成式對抗網絡(GAN)1,簡介與算法原理
    一、簡介生成式對抗網絡(GAN, Generative Adversarial Networks )是一種深度學習模型,是近年來複雜分布上無監督學習最具前景的方法之一。在整個過程中,生成器努力地讓生成的圖像更加真實,而判別器則努力地去識別出圖像的真假,這個過程相當於一個二人博弈,隨著時間的推移,生成器和判別器在不斷地進行對抗,最終兩個網絡達到了一個動態均衡:生成器生成的圖像接近於真實圖像分布,而判別器識別不出真假圖像,對於給定圖像的預測為真的概率基本接近 0.5(相當於隨機猜測類別)。
  • 生成式對抗網絡GAN的高級議題
    生成對抗網絡(GAN)就是一個幫你實現的新朋友。"GAN是過去10年機器學習中最有趣的想法。" - Facebook AI人工智慧研究總監Yann LeCun最近引入了生成對抗網作為訓練生成模型的新方法,即創建能夠生成數據的模型。它們由兩個"對抗"模式:生成模型G獲得數據和判別模型D來估計訓練數據提供的樣本的準確性。G和D可能是一個非線性映射函數,如多層感知。在生成對抗網絡(GAN)中,我們有兩個神經網絡在零和遊戲中相互對抗,其中第一個網絡,即生成器,其任務是欺騙第二個網絡,即鑑別器。
  • 【強化學習實戰】基於gym和tensorflow的強化學習算法實現
    上一講已經深入剖析了 gym 環境的構建強化學習實戰《第一講 gym學習及二次開發 - 知乎專欄》。這一講,我們將利用gym和tensorflow來實現兩個最經典的強化學習算法qleanring 和基於策略梯度的方法。本節課參考了莫煩的部分代碼(見知乎問答《強化學習(reinforcement learning)有什麼好的開源項目、網站、文章推薦一下?》),在此對其表示感謝。
  • TensorFlow 資源大全中文版
    循環神經網絡模型/工程圖片形態轉換 – 無監督圖片形態轉換的實現Show, Attend and Tell算法 -基於聚焦機制的自動圖像生成器Neural Style – Neural Style 算法的TensorFlow實現Pretty Tensor – Pretty Tensor提供了高級別的
  • 如何使用TensorFlow Hub的ESRGAN模型來在安卓app中生成超分圖片
    深度學習,尤其是對抗生成網絡 GAN,已經被成功應用在超分任務上,比如 SRGAN 和 ESRGAN 都可以生成比較真實的超分圖片。那麼在本文裡,我們將介紹一下如何使用TensorFlow Hub上的一個預訓練的 ESRGAN 模型來在一個安卓 app 中生成超分圖片。最終的 app 效果如下圖,我們也已經將完整代碼開源給大家參考。
  • GAN(生成對抗網絡)萬字長文綜述
    GAN的基本介紹生成對抗網絡(GAN,Generative Adversarial Networks)作為一種優秀的生成式模型,引爆了許多圖像生成的有趣應用。GAN的基本概念GAN(Generative Adversarial Networks)從其名字可以看出,是一種生成式的,對抗網絡。再具體一點,就是通過對抗的方式,去學習數據分布的生成式模型。所謂的對抗,指的是生成網絡和判別網絡的互相對抗。
  • 資源|17類對抗網絡經典論文及開原始碼(附源碼)
    原標題:資源|17類對抗網絡經典論文及開原始碼(附源碼) 全球人工智慧 文章來源:Github 對抗網絡專題文獻集Training](Apple paper) [Paper]https://arxiv.org/abs/1612.07828 [code]https://github.com/carpedm20/simulated-unsupervised-tensorflow
  • 萬字綜述之生成對抗網絡(GAN)
    文章目錄如下:GAN的基本介紹生成對抗網絡(GAN,Generative Adversarial Networks)作為一種優秀的生成式模型,引爆了許多圖像生成的有趣應用。GAN的基本概念GAN(Generative Adversarial Networks)從其名字可以看出,是一種生成式的,對抗網絡。再具體一點,就是通過對抗的方式,去學習數據分布的生成式模型。所謂的對抗,指的是生成網絡和判別網絡的互相對抗。
  • TensorFlow 攜手 NVIDIA,使用 TensorRT 優化 TensorFlow Serving...
    HTTP/REST API at:localhost:8501 …$ curl -o /tmp/resnet/resnet_client.py https://raw.githubusercontent.com/tensorflow/serving/master/tensorflow_serving/example/resnet_client.py
  • 深度解讀TensorFlow,了解它的最新發展!
    TensorBoard  TensorBoard是一套可視化工具,研發人員使用TensorFlow寫的神經網絡看上去會顯得非常複雜混亂,為了可以更加直觀的調試、優化神經網絡,谷歌開發了TensorBoard。
  • 不到200 行代碼,教你如何用 Keras 搭建生成對抗網絡(GAN)
    為此,本文將以深度卷積生成對抗網絡(Deep Convolutional GAN,DCGAN)為例,介紹如何基於 Keras 2.0 框架,以 Tensorflow 為後端,在 200 行代碼內搭建一個真實可用的 GAN 模型,並以該模型為基礎自動生成 MNIST 手寫體數字。
  • tensorflow初級必學算子
    在之前的文章中介紹過,tensorflow框架的核心是將各式各樣的神經網絡抽象為一個有向無環圖,圖是由tensor以及tensor變換構成;雖然現在有很多高階API可以讓開發者忽略這層抽象,但對於靈活度要求比較高的算法仍然需要開發者自定義網絡圖,所以建議開發者儘量先學習tf1.x
  • TensorFlow極速入門
    最後給出了在 tensorflow 中建立一個機器學習模型步驟,並用一個手寫數字識別的例子進行演示。1、tensorflow是什麼?tensorflow 是 google 開源的機器學習工具,在2015年11月其實現正式開源,開源協議Apache 2.0。
  • TensorFlow 中文資源全集,學習路徑推薦
    實戰項目,根據自己的需求進行開發。/GitHub:https://github.com/tensorflow安裝教程中文安裝教程Mac安裝:http://www.cnblogs.com/tensorflownews/p/7298646.htmlubuntu 16.04 安裝 tensorflow-gpu:http://www.tensorflownews.com/2017/09/02/tensorflow-gpu-install-ubuntu
  • Tensorflow 2.0 即將入場
    下面,我們就以在Tensorflow中實現簡單的GAN為例,更生動地展現上述步驟。Tensorflow 1.x的GAN要定義GAN的判別器D,我們一定會用到tf.variable_scope裡的reuse參數。因為首先我們會把真實圖像輸入判別器,之後把生成的假樣本再輸進去,在且僅在最後計算D的梯度。
  • 「CVPR Oral」TensorFlow實現StarGAN代碼全部開源,1天訓練完
    開源地址:https://github.com/taki0112/StarGAN-TensorflowStarGAN 是去年 11 月由香港科技大學、新澤西大學和韓國大學等機構的研究人員提出的一個圖像風格遷移模型,是一種可以在同一個模型中進行多個圖像領域之間的風格轉換的對抗生成方法。
  • 從系統和代碼實現角度解析TensorFlow的內部實現原理|深度
    本文依據對Tensorflow(簡稱TF)白皮書[1]、TF Github[2]和TF官方教程[3]的理解,從系統和代碼實現角度講解TF的內部實現原理。以Tensorflow r0.8.0為基礎,本文由淺入深的闡述Tensor和Flow的概念。先介紹了TensorFlow的核心概念和基本概述,然後剖析了OpKernels模塊、Graph模塊、Session模塊。1.
  • 步履不停:TensorFlow 2.4新功能一覽!
    參數伺服器訓練教程           https://tensorflow.google.cn/tutorials/distribute/parameter_server_training    ClusterCoordinator           https://tensorflow.google.cn/api_docs/python
  • 深度學習筆記8:利用Tensorflow搭建神經網絡
    作者:魯偉 一個數據科學踐行者的學習日記。
  • 5分鐘入門GANS:原理解釋和keras代碼實現
    >介紹生成式敵對網絡通常也稱為GANs,用於生成圖像而不需要很少或沒有輸入。GANs允許我們生成由神經網絡生成的圖像。在我們深入討論這個理論之前,我想向您展示GANs構建您興奮感的能力。把馬變成斑馬(反之亦然)。歷史生成式對抗網絡(GANs)是由Ian Goodfellow (GANs的GAN Father)等人於2014年在其題為「生成式對抗網絡」的論文中提出的。