丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能開發(fā)者 正文
發(fā)私信給AI研習(xí)社
發(fā)送

0

從零教你寫一個(gè)完整的GAN

本文作者: AI研習(xí)社 編輯:賈智龍 2017-04-27 16:24
導(dǎo)語(yǔ):GAN這么火,不想自己復(fù)現(xiàn)一下么?

導(dǎo)言

啦啦啦,現(xiàn)今 GAN 算法可以算作 ML 領(lǐng)域下比較熱門的一個(gè)方向。事實(shí)上,GAN 已經(jīng)作為一種思想來(lái)滲透在 ML 的其余領(lǐng)域,從而做出了很多很 Amazing 的東西。比如結(jié)合卷積神經(jīng)網(wǎng)絡(luò),可以用于生成圖片?;蛘呓Y(jié)合 NLP,可以生成特定風(fēng)格的短句子。(比如川普風(fēng)格的 twitter......)

可惜的是,網(wǎng)絡(luò)上很多老司機(jī)開 GAN 的車最后都翻了,大多只是翻譯了一篇論文,一旦涉及算法實(shí)現(xiàn)部分就直接放開源的實(shí)現(xiàn)地址,而那些開源的東東,缺少了必要的引導(dǎo),實(shí)在對(duì)于新手來(lái)說(shuō)很是懵逼。所以兔子哥哥帶著開好車,開穩(wěn)車的心態(tài),特定來(lái)帶一下各位想入門 GAN 的其他小兔兔們來(lái)飛一會(huì)。

GAN 的介紹與訓(xùn)練

先來(lái)闡述一下 GAN 的基本做法,這里不擺公式,因?yàn)槟懵犕旰?,該怎么搭建和怎么?xùn)練你心里應(yīng)該有數(shù)了。

首先,GAN 全稱為 Generative Adversarial Nets(生成對(duì)抗網(wǎng)絡(luò)), 其構(gòu)成分為兩部份:

  • Generator(生成器),下文簡(jiǎn)稱 G

  • Discriminator(辨別器), 下文簡(jiǎn)稱 D。

在本文,為了方便小兔兔理解,使用一個(gè)較為簡(jiǎn)單,也是 GAN 論文提及到的例子,訓(xùn)練 G 生成符合指定均值和標(biāo)準(zhǔn)差的數(shù)據(jù),在這里,我們指定 MEAN=4,STD=1.5 的高斯分布(正態(tài)分布)。

這貨的樣子大概長(zhǎng)這樣

從零教你寫一個(gè)完整的GAN

下面是數(shù)據(jù)生成的代碼:

def sample_data(size, length=100):
   """    隨機(jī)mean=4 std=1.5的數(shù)據(jù)    :param size:    :param length:    :return:    """
   data = []
   for _ in range(size):
       data.append(sorted(np.random.normal(4, 1.5, length)))
   return np.array(data)

在生成高斯分布的數(shù)據(jù)后,我們還對(duì)數(shù)據(jù)進(jìn)行了排序,這時(shí)因?yàn)榕判蚝蟮挠?xùn)練會(huì)相對(duì)平滑。具體原因看這個(gè) [Generative Adversarial Nets in TensorFlow (Part I)]

這一段是生成噪音的代碼,既然是噪音,那么我們只需要隨機(jī)產(chǎn)生 0~1 的數(shù)據(jù)就好。

def random_data(size, length=100):
   """    隨機(jī)生成數(shù)據(jù)    :param size:    :param length:    :return:    """
   data = []
   for _ in range(size):
       x = np.random.random(length)
       data.append(x)
   return np.array(data)

隨機(jī)分布的數(shù)據(jù)長(zhǎng)這樣

從零教你寫一個(gè)完整的GAN

接下來(lái)就是開擼 GAN 了。

首先的一點(diǎn)就是,我們需要確定 G, 和 D 的具體結(jié)構(gòu),這里因?yàn)楸疚牡睦犹^(guò)于入門級(jí),并不需要使用到復(fù)雜的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),比如卷積層和遞歸層,這里 G 和 D 只需全連接的神經(jīng)網(wǎng)絡(luò)就好。全連接層的神經(jīng)網(wǎng)絡(luò)本質(zhì)就是矩陣的花式相乘。為神馬說(shuō)是花式相乘呢,因?yàn)榇蠖鄶?shù)時(shí)候,我們?cè)诰仃囅喑说慕Y(jié)果后面會(huì)添加不同的激活函數(shù)。

從零教你寫一個(gè)完整的GAN

G 和 D 分別為三層的全鏈接的神經(jīng)網(wǎng)絡(luò),其中 G 的激活函數(shù)分別為,relu,sigmoid,liner,這里前兩層只是因?yàn)榭紤]到數(shù)據(jù)的非線性轉(zhuǎn)換,并沒(méi)有什么特別選擇這兩個(gè)激活函數(shù)的原因。其次 D 的三層分別為 relu,sigmoid,sigmoid。

接下來(lái)就引出 GAN 的訓(xùn)練問(wèn)題。GAN 的思想源于博弈論,直白一點(diǎn)就是套路與反套路。

先從 D 開始分析,D 作為辨別器,它的職責(zé)就是區(qū)分于真實(shí)的高斯分布和 G 生成的” 假” 高斯分布。所以很顯然,針對(duì) D 來(lái)說(shuō),其需要解決的就是傳統(tǒng)的二分類問(wèn)題。

在二分類問(wèn)題中,我們習(xí)慣用交叉熵來(lái)衡量分類效果。

從零教你寫一個(gè)完整的GAN

從公式中不難看出,在全部分類正確時(shí),交叉熵會(huì)接近于 0,因此,我們的目標(biāo)就是通過(guò)擬合 D 的參數(shù)來(lái)最小化交叉熵的值。

D 既然是傳統(tǒng)的二分類問(wèn)題,那么 D 的訓(xùn)練過(guò)程也很容易得出了

  • 即先把真實(shí)數(shù)據(jù)標(biāo)識(shí)為‘1’(真實(shí)分布),由生成器生成的數(shù)據(jù)標(biāo)識(shí)為’0‘(生成分布),反復(fù)迭代訓(xùn)練 D   ------------ (1)

說(shuō) G 的訓(xùn)練之前先來(lái)打個(gè)比方,假如一男一女在一起了,現(xiàn)在兩人性格出現(xiàn)矛盾了,女生并不愿意改變,但兩個(gè)人都想繼續(xù)在一起,這時(shí),唯一的方法就是男生改變了。先忽略現(xiàn)實(shí)生活的問(wèn)題,但從舉例的角度說(shuō),顯然久而久之男生就會(huì)變得更加 fit 這個(gè)女生。

G 的訓(xùn)練也是如此:

  • 先將 G 拼接在 D 的上方,即 G 的輸出作為 D 的輸入(男生女生在一起),而同時(shí)固定 D 的參數(shù)(女生不愿意改變),并將進(jìn)入 G 的噪音樣本標(biāo)簽全部改成'1'(目標(biāo)是兩個(gè)人繼續(xù)在一起,沒(méi)有其他選擇),為了最小化損失函數(shù),此時(shí)就只能改變 G 的每一層權(quán)重,反復(fù)迭代后 G 的生成能力因此得以改進(jìn)。(男生更適合女生)  ------------ (2)

反復(fù)迭代(1)(2),最終 G 就會(huì)得到較好的生成能力。

補(bǔ)充一點(diǎn),在訓(xùn)練 D 的時(shí)候,我曾把數(shù)據(jù)直接放進(jìn)去,這樣的后果是最后生成的數(shù)據(jù),能學(xué)習(xí)到高斯分布的輪廓,但標(biāo)準(zhǔn)差和均值則和真實(shí)樣本相差很大。因此,這里我建議直接使用平均值和標(biāo)準(zhǔn)差作為 D 的輸入。

這使得 D 在訓(xùn)練前需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理。

def preprocess_data(x):
   """    計(jì)算每一組數(shù)據(jù)平均值和方差    :param x:    :return:    """
   return [[np.mean(data), np.std(data)] for data in x]

G 和 D 的連接之間也需要做出處理。

# 先求出G_output3的各行平均值和方差 

MEAN = tf.reduce_mean(G_output3, 1)  # 平均值,但是是1D向量

MEAN_T = tf.transpose(tf.expand_dims(MEAN, 0))  # 轉(zhuǎn)置

STD = tf.sqrt(tf.reduce_mean(tf.square(G_output3 - MEAN_T), 1))

DATA = tf.concat(1, [MEAN_T,
                    tf.transpose(tf.expand_dims(STD, 0))] # 拼接起來(lái)

以下是損失函數(shù)變化圖:

  • 藍(lán)色是 D 單獨(dú)作二分類問(wèn)題處理時(shí)的變化

  • 綠色是拼接 G 在 D 的上方后損失函數(shù)的變化

從零教你寫一個(gè)完整的GAN

不難看出,兩者在經(jīng)歷反復(fù)震蕩 (互相博弈而導(dǎo)致),最后穩(wěn)定于 0.5 附近,這時(shí)我們可以認(rèn)為,G 的生成能力已經(jīng)達(dá)到以假亂真,D 再也不能分出真假。

接下來(lái)的這個(gè)就是 D-G 博弈 200 次后的結(jié)果:

  • 綠色是真實(shí)分布

  • 藍(lán)色是噪音原本的分布

  • 紅色是生成分布

從零教你寫一個(gè)完整的GAN

后話

兔子哥哥的車這次就開到這里了。作為一個(gè)大三且數(shù)學(xué)能力較為一般的學(xué)生, 從比較感性的角度來(lái)描述了一次 GAN 的基本過(guò)程,有說(shuō)得不對(duì)地方請(qǐng)各位見諒和指點(diǎn)。

如果各位讀者需要更嚴(yán)格的數(shù)學(xué)公式和證明,可以閱讀 GAN 的開山之作([1406.2661] Generative Adversarial Networks) , 另外本文提及的代碼都可在這里找到(MashiMaroLjc/learn-GAN),有需要的童鞋也可以私信交流。

這就是全部?jī)?nèi)容了,下次心情好的話懟 DCGAN,看看能不能生成點(diǎn)好玩的圖片,嗯~ 睡覺(jué)去~

雷鋒網(wǎng)按:本文原作者兔子老大,原文來(lái)自他的知乎專欄

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

從零教你寫一個(gè)完整的GAN

分享:
相關(guān)文章

編輯

聚焦數(shù)據(jù)科學(xué),連接 AI 開發(fā)者。更多精彩內(nèi)容,請(qǐng)?jiān)L問(wèn):yanxishe.com
當(dāng)月熱門文章
最新文章
請(qǐng)?zhí)顚懮暾?qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡(jiǎn)介
為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說(shuō)