最近在研究深度學習相關的知識,看了cnn、rnn、dnn等經典的神經網路,然後研究了一下生成模型,也就是今天要講的生成對抗網路(gan),打算出乙個系列,畢竟關於生成對抗網路的**太多了,github上有整理,有興趣的小夥伴可以自己看看原**順便跑一下**,真的很有意思。
gan自誕生起一直頗受讚譽,後期也衍生了很多變種,大多數只是在損失函式這一塊做文章,不過也有頗多成效,gan也有它自身的缺點,不過在wgan以後得到了很大的改善。gan的提出者是goodfellow, 據說他是在喝醉了以後偶然想出來的,唉,這大概也是人與人之間的差距吧。
gan本質上是乙個minimax遊戲,它會同時訓練兩個神經網路g和d。g負責生成樣本;d負責判斷這個樣本是真實的樣本還是g生成的樣本。g和d是分開訓練的,損失函式如下:
(不是很會使用csdn的公式編輯器,所以暫時截圖代替)
d(x)表示x來自於真實資料的概率。z為隨機噪音,為生成器提供泛化能力。
從判別器d的角度看,它要將生成的判別為fake(d(x)=0), 真實的訓練判斷為real (d(x)=1);從生成器的角度看,它要讓生成的盡可能真實,對應於上式右邊第二項。
gan的網路結構圖如下
生成器和判別器是分開訓練的,訓練生成器時,判別器引數固定,整個網路只訓練生成器;訓練判別器時是一樣的。整個網路存在最優解,此時,d(x=fake)=1/2,說明此時判別器無法區分出生成和訓練,生成器的目的已經達到。
以上便是gan的訓練演算法,判別器訓練k輪,生成器訓練1輪,交替進行訓練。
我利用了github上的**,**的結構與上述說明一致。總共訓練了30000輪。我們採用了mnist資料集。
就是一團隨機噪音而已。
訓練1000輪後:
開始有了數字的模樣。
訓練5000輪以後:
已經很不錯了。訓練30000次的效果和這差不多。
原始gan還有如下缺點:
1.難以訓練到收斂。這個問題從訓練過程中可以看出來,最後的生成器誤差大概在0.6左右,之後會在此上下波動,難以達到最佳的0.5。這個和生成器的損失函式有一定關係,後續的wgan專門針對這個問題進行了改進。
2.類別無法控制。比如對於mnist資料集,能夠生成0-9的數字,但是我如果只想生成數字0的呢?原始gan是無法做到的,這個在後面的gan版本裡有改進,措施是在訓練的同時加入類別標籤。
以上就是gan的基本內容了。雖然gan還有不少問題,但還是具有重大的指導意義,後來者也提出了一系列的改進方案,由此產生了一系列的衍生版本。
如果本文有什麼問題,可以與我**。
GAN 生成對抗網路
原理 假設我們有兩個網路 乙個生g generator 乙個判別d discriminator g是乙個生成的的網路,它接受乙個隨機的雜訊z,通過這個雜訊生成,記做g z d是乙個判別網路,判斷一張是不是 真實的 它的輸入引數是x,x代表一張的。輸出d x 代表x為真實的概率,如果為1,就代表100...
生成對抗網路 GAN
原文 generative adversarial networks 模型組成 核心公式 演算法圖示化描述 全域性最優點 pg pdata 效果與對比展望 ming maxdv d,g exp data x logd x exp x x log 1 d g z 分析 上方為 gan 網路的核心演算法...
GAN(生成對抗網路)
gan,generative adversarial network.起源於2014年,nips的一篇文章,generative adversarial net.gan,是一種二人博弈的思想,雙方利益之和是乙個常數,是固定的。你的利益多點,對方利益就少點。gan裡面,博弈雙方是 乙個叫g 生成模型 ...