日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GAN

發布時間:2024/1/23 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GAN 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

詳解GAN代碼之逐行解析GAN代碼

本文鏈接:https://blog.csdn.net/jiongnima/article/details/80033169

訓練數據集:手寫數字識別

下載鏈接:https://pan.baidu.com/s/1d9jX5xLHd1x3DFChVCe3LQ?密碼:ws28

? ?在本篇博客中,筆者將逐行解析一下NIPS 2014的Generative Adversarial Networks(生成對抗網絡,簡稱GAN)代碼,該篇文章作為GAN系列的開山之作,在近3年吸引了無數學者的目光。在2017-2018年,各大計算機頂會中也都能看到各種GAN的身影。因此,本篇博客就來逐行解析一下使用GAN生成手寫數字的代碼

? ?在正式開始之前,筆者想說的是,如果要使得本篇博客對各位讀者朋友的學習有幫助,請各位讀者朋友們先熟悉生成對抗網絡的基本原理。由于對于生成對抗網絡的原理詳解網絡上的資源比較多,在本篇博客中筆者就不再對生成對抗網絡的原理進行解釋,而是給大家推薦一些對生成對抗網絡原理進行了解的鏈接:

1. 直接進行論文閱讀:https://arxiv.org/abs/1406.2661

2. 一篇通俗易懂,形象的GAN原理解釋:一文看懂生成式對抗網絡GANs:介紹指南及前景展望

3. 一篇比較詳細的CSDN博文:生成式對抗網絡GAN研究進展(二)——原始GAN

4. 知乎專欄上的文章:GAN原理學習筆記

? ?如果對生成對抗網絡原理已經熟稔的讀者朋友,請自動忽略以上鏈接。并且,筆者以下放出的代碼注釋是參考了github上面的代碼,鏈接https://github.com/wiseodd/generative-models

? ?在這里筆者也想衷心感謝一下這位wiseodd大神,在他的generative-models下面的關于生成模型的代碼非常全面,本文解析的代碼路徑是該工程下面的GAN/vanilla_gan/gan_tensorflow.py文件。筆者沿用了作者的代碼,只是增加了模型保存與summary記錄的少量代碼,下面放出代碼及注釋:

import tensorflow as tf #導入tensorflow from tensorflow.examples.tutorials.mnist import input_data #導入手寫數字數據集 import numpy as np #導入numpy import matplotlib.pyplot as plt #plt是繪圖工具,在訓練過程中用于輸出可視化結果 import matplotlib.gridspec as gridspec #gridspec是圖片排列工具,在訓練過程中用于輸出可視化結果 import os #導入osdef save(saver, sess, logdir, step): #保存模型的save函數model_name = 'model' #模型名前綴checkpoint_path = os.path.join(logdir, model_name) #保存路徑saver.save(sess, checkpoint_path, global_step=step) #保存模型print('The checkpoint has been created.')def xavier_init(size): #初始化參數時使用的xavier_init函數in_dim = size[0] xavier_stddev = 1. / tf.sqrt(in_dim / 2.) #初始化標準差return tf.random_normal(shape=size, stddev=xavier_stddev) #返回初始化的結果X = tf.placeholder(tf.float32, shape=[None, 784]) #X表示真的樣本(即真實的手寫數字)D_W1 = tf.Variable(xavier_init([784, 128])) #表示使用xavier方式初始化的判別器的D_W1參數,是一個784行128列的矩陣 D_b1 = tf.Variable(tf.zeros(shape=[128])) #表示全零方式初始化的判別器的D_1參數,是一個長度為128的向量D_W2 = tf.Variable(xavier_init([128, 1])) #表示使用xavier方式初始化的判別器的D_W2參數,是一個128行1列的矩陣 D_b2 = tf.Variable(tf.zeros(shape=[1])) ##表示全零方式初始化的判別器的D_1參數,是一個長度為1的向量theta_D = [D_W1, D_W2, D_b1, D_b2] #theta_D表示判別器的可訓練參數集合Z = tf.placeholder(tf.float32, shape=[None, 100]) #Z表示生成器的輸入(在這里是噪聲),是一個N列100行的矩陣G_W1 = tf.Variable(xavier_init([100, 128])) #表示使用xavier方式初始化的生成器的G_W1參數,是一個100行128列的矩陣 G_b1 = tf.Variable(tf.zeros(shape=[128])) #表示全零方式初始化的生成器的G_b1參數,是一個長度為128的向量G_W2 = tf.Variable(xavier_init([128, 784])) #表示使用xavier方式初始化的生成器的G_W2參數,是一個128行784列的矩陣 G_b2 = tf.Variable(tf.zeros(shape=[784])) #表示全零方式初始化的生成器的G_b2參數,是一個長度為784的向量theta_G = [G_W1, G_W2, G_b1, G_b2] #theta_G表示生成器的可訓練參數集合def sample_Z(m, n): #生成維度為[m, n]的隨機噪聲作為生成器G的輸入return np.random.uniform(-1., 1., size=[m, n])def generator(z): #生成器,z的維度為[N, 100]G_h1 = tf.nn.relu(tf.matmul(z, G_W1) + G_b1) #輸入的隨機噪聲乘以G_W1矩陣加上偏置G_b1,G_h1維度為[N, 128]G_log_prob = tf.matmul(G_h1, G_W2) + G_b2 #G_h1乘以G_W2矩陣加上偏置G_b2,G_log_prob維度為[N, 784]G_prob = tf.nn.sigmoid(G_log_prob) #G_log_prob經過一個sigmoid函數,G_prob維度為[N, 784]return G_prob #返回G_probdef discriminator(x): #判別器,x的維度為[N, 784]D_h1 = tf.nn.relu(tf.matmul(x, D_W1) + D_b1) #輸入乘以D_W1矩陣加上偏置D_b1,D_h1維度為[N, 128]D_logit = tf.matmul(D_h1, D_W2) + D_b2 #D_h1乘以D_W2矩陣加上偏置D_b2,D_logit維度為[N, 1]D_prob = tf.nn.sigmoid(D_logit) #D_logit經過一個sigmoid函數,D_prob維度為[N, 1]return D_prob, D_logit #返回D_prob, D_logitdef plot(samples): #保存圖片時使用的plot函數fig = plt.figure(figsize=(4, 4)) #初始化一個4行4列包含16張子圖像的圖片gs = gridspec.GridSpec(4, 4) #調整子圖的位置gs.update(wspace=0.05, hspace=0.05) #置子圖間的間距for i, sample in enumerate(samples): #依次將16張子圖填充進需要保存的圖像ax = plt.subplot(gs[i])plt.axis('off')ax.set_xticklabels([])ax.set_yticklabels([])ax.set_aspect('equal')plt.imshow(sample.reshape(28, 28), cmap='Greys_r')return figG_sample = generator(Z) #取得生成器的生成結果 D_real, D_logit_real = discriminator(X) #取得判別器判別的真實手寫數字的結果 D_fake, D_logit_fake = discriminator(G_sample) #取得判別器判別的生成的手寫數字的結果D_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_logit_real, labels=tf.ones_like(D_logit_real))) #對判別器對真實樣本的判別結果計算誤差(將結果與1比較) D_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_logit_fake, labels=tf.zeros_like(D_logit_fake))) #對判別器對虛假樣本(即生成器生成的手寫數字)的判別結果計算誤差(將結果與0比較) D_loss = D_loss_real + D_loss_fake #判別器的誤差 G_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_logit_fake, labels=tf.ones_like(D_logit_fake))) #生成器的誤差(將判別器返回的對虛假樣本的判別結果與1比較)dreal_loss_sum = tf.summary.scalar("dreal_loss", D_loss_real) #記錄判別器判別真實樣本的誤差 dfake_loss_sum = tf.summary.scalar("dfake_loss", D_loss_fake) #記錄判別器判別虛假樣本的誤差 d_loss_sum = tf.summary.scalar("d_loss", D_loss) #記錄判別器的誤差 g_loss_sum = tf.summary.scalar("g_loss", G_loss) #記錄生成器的誤差summary_writer = tf.summary.FileWriter('snapshots/', graph=tf.get_default_graph()) #日志記錄器D_solver = tf.train.AdamOptimizer().minimize(D_loss, var_list=theta_D) #判別器的訓練器 G_solver = tf.train.AdamOptimizer().minimize(G_loss, var_list=theta_G) #生成器的訓練器mb_size = 128 #訓練的batch_size Z_dim = 100 #生成器輸入的隨機噪聲的列的維度mnist = input_data.read_data_sets('../../MNIST_data', one_hot=True) #mnist是手寫數字數據集sess = tf.Session() #會話層 sess.run(tf.global_variables_initializer()) #初始化所有可訓練參數if not os.path.exists('out/'): #初始化訓練過程中的可視化結果的輸出文件夾os.makedirs('out/')if not os.path.exists('snapshots/'): #初始化訓練過程中的模型保存文件夾os.makedirs('snapshots/')saver = tf.train.Saver(var_list=tf.global_variables(), max_to_keep=50) #模型的保存器i = 0 #訓練過程中保存的可視化結果的索引for it in range(1000000): #訓練100萬次if it % 1000 == 0: #每訓練1000次就保存一下結果samples = sess.run(G_sample, feed_dict={Z: sample_Z(16, Z_dim)})fig = plot(samples) #通過plot函數生成可視化結果plt.savefig('out/{}.png'.format(str(i).zfill(3)), bbox_inches='tight') #保存可視化結果i += 1plt.close(fig)X_mb, _ = mnist.train.next_batch(mb_size) #得到訓練一個batch所需的真實手寫數字(作為判別器的輸入)#下面是得到訓練一次的結果,通過sess來run出來_, D_loss_curr, dreal_loss_sum_value, dfake_loss_sum_value, d_loss_sum_value = sess.run([D_solver, D_loss, dreal_loss_sum, dfake_loss_sum, d_loss_sum], feed_dict={X: X_mb, Z: sample_Z(mb_size, Z_dim)})_, G_loss_curr, g_loss_sum_value = sess.run([G_solver, G_loss, g_loss_sum], feed_dict={Z: sample_Z(mb_size, Z_dim)})if it%100 ==0: #每過100次記錄一下日志,可以通過tensorboard查看summary_writer.add_summary(dreal_loss_sum_value, it)summary_writer.add_summary(dfake_loss_sum_value, it)summary_writer.add_summary(d_loss_sum_value, it)summary_writer.add_summary(g_loss_sum_value, it)if it % 1000 == 0: #每訓練1000次輸出一下結果save(saver, sess, 'snapshots/', it)print('Iter: {}'.format(it))print('D loss: {:.4}'. format(D_loss_curr))print('G_loss: {:.4}'.format(G_loss_curr))print()

? ?在上面的代碼中,各位讀者朋友可以看到,生成器與判別器都是使用多層感知機實現的(沒有使用卷積神經網絡)。生成器的輸入是隨機噪聲,生成的是手寫數字,生成器與判別器均使用Adam優化器進行訓練并訓練100w次。

? ?在上面的代碼中,筆者添加了各種summary保存了訓練中的誤差,結果如下所示。

? ?判別器判別真實樣本的誤差變化:

? ?判別器判別虛假樣本(即生成器G生成的手寫數字)的誤差變化:

? ?判別器的誤差變化(上面兩者之和):

? ?生成器的誤差變化:

? ?下面是訓練過程中輸出的可視化結果,筆者選擇了一些,大家可以看到,生成器輸出結果最開始非常糟糕,但是隨著訓練的進行到訓練中期輸出效果越來越好:

? ?訓練2k次的輸出:

? ?訓練6k次的輸出:

? ?訓練4.2w次的輸出

? ?訓練14.4w次的輸出:

? ?訓練24.4w次的輸出:

? ?訓練31.6w次的輸出:

? ?在訓練的后期(訓練80w次之后),大家從生成器的誤差曲線可以看出,生成器的誤差陡增,生成效果也相應變差了(如下圖所示),這是生成器與判別器失衡的結果。

? ?訓練85.7w次的輸出:

? ?訓練93.6w次的輸出:

? ?訓練97.2w次的輸出:

總結

以上是生活随笔為你收集整理的GAN的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中国一级大黄大黄大色毛片 | 中文字幕一区av | 亚洲精品乱码久久久久久麻豆不卡 | 亚洲成人一二区 | 超碰人人在线观看 | 裸体av淫导航 | 成人福利小视频 | 亚洲国产精品激情在线观看 | 国产九色sp调教91 | 中文字幕在线观看91 | 国产精品电影在线观看 | 神马久久久久 | 婷婷另类小说 | 国产乱子伦农村叉叉叉 | 视色视频 | 大桥未久av在线播放 | 人妻精油按摩bd高清中文字幕 | 黄色录象片 | 久久综合一本 | 五月婷婷欧美 | 国产区欧美区日韩区 | 久久激情小说 | 精品国产乱码久久久久久蜜臀网站 | 黄色在线视频观看 | 中文在线亚洲 | 波波野结衣 | 日本无遮羞调教打屁股网站 | 综合久久网 | 可以在线看黄的网站 | 男性裸体全身精光gay | 嫩嫩av| 五月婷婷久久久 | 熟妇人妻中文字幕无码老熟妇 | 激情在线观看视频 | 91本色 | 国产日日操| 人人模人人爽 | 99久久99久久精品国产片桃花 | 免费一区二区 | 一级黄色免费看 | 亚洲最黄网站 | 精品人妻人人做人人爽夜夜爽 | 不卡影院一区二区 | 97超视频| 老师上课夹震蛋高潮了 | 国产情侣呻吟对白高潮 | 亚欧精品在线 | 国产香蕉尹人视频在线 | 成人在线播放网站 | 亚洲一区二区三区成人 | 久久午夜网站 | 亚洲欧美精品 | 妹子干综合 | 国产一区日韩一区 | 黑人爱爱视频 | 高潮又黄又刺激 | 少妇太紧太爽又黄又硬又爽 | 亚洲高清久久久 | 亚洲一区二区三区av无码 | 成人毛片在线精品国产 | 中文在线国产 | 精品小视频在线观看 | 黄色片久久久久 | 69精品一区二区 | 国产综合在线视频 | 538国产精品一区二区免费视频 | jiizzyou欧美2| 国产日韩欧美中文字幕 | 91在线观看网站 | 欧美私人影院 | 精品黑人 | 毛片在线网 | 翔田千里x88aⅴ | 欧美一区二区国产 | 国产超碰人人爽人人做人人爱 | 亚洲熟女乱色一区二区三区 | 小日子的在线观看免费第8集 | 日韩欧洲亚洲 | av操操操 | 狠狠a | 最新中文字幕在线视频 | 色综合av综合无码综合网站 | 老司机av导航 | 激情黄色小视频 | 日日操日日摸 | 国产小视频在线观看 | 爽爽爽av| 久久国产精品无码一级毛片 | 国产性生活网站 | 中文字幕无线精品亚洲乱码一区 | 99久久精品免费视频 | 日本欧美精品 | 中文字幕在线观看一区二区三区 | 国产激情片 | 误杀1电影免费观看高清完整版 | 午夜亚洲一区 | 牛牛在线 | 久久久久久久久久久久国产 | 成人做爰免费视频免费看 |