GAN
GAN,Generative Adversarial Networks, 意爲對抗生成網絡,原始的GAN是一種無監督學習方法,通過使用‘對抗’的思想來學習生成式模型,一旦訓練完成後可以全新的數據樣本。
GAN原理
我們可以把GAN理解爲一個生成數據的工具,實際GAN可以應用到任何類型的數據。
GAN包括連個網絡,生成網絡G(Generrater) 和 判別網絡 D(Discriminator)。
G負責生成圖片,它接收一個隨機的噪聲z,通過該噪聲生成圖片,將生成圖片標記爲G(z)
D負責判別一張圖片是不是‘真實的’。它的輸入是x,x代表一張圖片,輸出D(x)表示x爲真實圖片的概率,如果爲1,代表是真實圖片的概率爲100%,而輸出爲0,則代表圖片不可能是真實的圖片。
GAN基本思想:‘博弈’
生成網絡G的目標是儘可能生成真實的圖片去欺騙判別網絡D。而D的目標是儘量把G生成的圖片和真實的圖片區分開來。這就構成了‘博弈’的思想。
當我們訓練過後,在最理想的狀態下,生成網絡G可以生成非常逼真的圖片,以假亂真的程度。而判別網絡很難判別G生成的圖片是不是真實的。即D(G(z))=0.5。此時我們就得到了一個生成式的模型G,它可以用來生成圖片。
用數學化的語言來描述‘博弈’的過程
真實的圖片有着自己的數據分佈。我們網絡G學習的過程,可以理解爲學習真實圖片的數據的分佈的過程。
我們輸入一個隨機的噪聲z,通過網絡G,生成一個圖片G(z)。當這個圖片的數據分佈越接近真實的圖片的分佈的時候,
這個生成的圖片G(z)就越像真實的圖片。
損失函數
我們可以看到圖片中的損失函數V(D,G)有兩個部分,第一部分爲判別網絡D的部分,我們可以理解爲從訓練數據中我們取出一張真實的圖片x,把x 輸入到網絡種。D(x)越大就代表D的判別能力越好。由此看出我們判別網絡D期望我們的損失函數V(D,G)的值變大。
第二部分爲生成網絡的部分,我們在生成網絡中輸入一個隨機的噪聲z,網絡生成一張圖片G(z),D(G(z))爲判別網絡對生成圖片的判別結果,當D(G(z))的值越大的時候,就表示我們G生成的圖片越逼真,此時 ln(1-D(G(z)))越小,損失函數V(D,G)越小。這是我們生成網絡期望的。
使用梯度下降法優化損失函數
1在優化的過程中我們可以,每對D更新一次參數,便接着再更新一次G。
有時也可以多次優化D的參數,再優化一次G的參數。 哪種方式要根據實際情況考慮。
2我們判別網絡D期望損失函數更大所以在更新參數的時候是加上梯度的方式,生成網絡G則與之相反。
3當我們訓練完成後,生成網絡G是一個生成式網絡,可以輸入噪聲z來生成圖片。
DCGAN
DCGAN意爲深度卷積對抗網絡。在GAN基礎上增加深度卷積網絡結構,專門生成圖像樣本。在GAN中並沒有對D,C的具體結構做出任何限制,在DCGAN中對D和G採用了較爲 特殊的結構,以便對圖片進行有效的建模。
判別網絡D和生成網絡的結構都是卷積神經網絡。
判別網絡D,輸入的是一張圖片,輸出的是這張圖片是真實圖片的概率。
生成網絡G ,輸入的是一個100維的噪聲向量,輸出的是一張圖片。
DCGAN在有一些優化的細節
1不採用任何池化層,在D中用帶有步長的卷積來代替池化層,避免了池化帶來的數據上信息的丟失。
2使用Batch Normalization 加速收斂。
3生成網絡G除了最後一層,每一層都使用了Relu激活函數。最後一層使用的激活函數是tanh函數。由於網絡G最後一層輸出的是圖片。
圖片的像素值是0~255,如果使用Relu激活函數,輸出的數值會較大。而tanh函數的範圍是(-1,1) 數值較小。
而且經過簡單的變換就可以得到像素值。即加一後乘127.5。
4網絡D都是用Leaky Relu作爲激活函數。
可以看下面這個博客瞭解Leaky Relu
https://blog.csdn.net/qq_23304241/article/details/80300149
DCGAN的一些應用
1生成圖片
LSUN是關於臥室場景的圖片,DCGAN訓練完成後就可以生成圖片了。
2利用DCGAN做圖像表示的‘插值’
也可以利用DAGAN做圖像表示的運算
cGAN
GAN的限制,GAN可以生成新的樣本丹斯我們無法控制樣本的類型,比如生成數字但是不能指定生成的是什麼數字。這是由於我們輸入的只有一個隨機的噪聲z。
cGAN就可以做到這點:可以指定生成新樣本的類型。
cGAN即條件對抗生成網絡,它爲生成器,判別器,都額外加入了一個條件y,即我們希望生成的標籤。
生成器G,輸入一個噪聲z,一個條件y,輸出符合這個條件的圖像G(z|y)
判別器D,輸入一張圖像x,一個條件y,輸出該圖像在該條件下的真實概率D(x|y)
cGAN網絡結構
cGAN損失函數
pix2pix
圖像翻譯
我們都知道機器翻譯是把一段中文翻譯成英文。在圖像領域也有類似的圖像翻譯。比如把街景,建築,文星圖像的標示圖轉換成真實的圖片。或者白天黑天的轉換。輪廓轉換爲實物等。
pix2pix模型結構
1我們向生成器G輸入一個鞋子輪廓圖x,生成了一個鞋子圖片G(x)。我們將生成的圖片G(x)和輸入的輪廓圖x即標籤。輸入到判別器D中.判別器輸出是真的鞋子圖片的概率。
2我們輸入一張真實的鞋子的圖片y 和一個標籤x D判別是不是真的鞋子圖片。
3在這個機構中我們的網絡G不會考慮噪聲的存在,即使輸入噪聲也會被忽略,所以這裏沒有輸入噪聲。
4損失函數的改變
在實驗中發現我們除了使用cGAN的損失函數,我們還可以生成圖像與真實圖像之間的損失,假設(x,y)是一個真實的圖片對。這裏假設x是真實的圖片,而y是輪廓圖。那麼生成圖片與真實圖片之間的L1損失爲
L1=||x-G(y)||
5PatchGAN
PatchGAN的思想是在判別一個圖片是否是真實的圖片時,不直接輸入整張圖片,而是把圖片劃分爲N*N個小格子輸入到判別網絡中,我們平均這幾次的輸出結果作爲判別的結果。
這樣可以加快計算以及加快收斂。
6pix2pix的本質還是cGAN只是在圖片翻譯問題上面對D和G做了一些細節上面的調整。
CycleGAN
在cGAN中我們可以通過把輸入的條件的值設置爲數字1來生成一個數字1的圖片。
在pix2pix中我們輸入鞋子的輪廓圖 生成鞋子的圖片,或者輸入 一個房子的標註圖 生成一個房子的圖片。
但是再cGAN和pix2pix 的樣本都是要求 嚴格成對的 比如 一個真實的鞋子圖片 和 一個 鞋子的輪廓圖。
pix2pix要求訓練數據必須在X空間和Y空間嚴格成對。
然而現實中這樣成對的樣本往往是比較困難獲得的。
CycleGAN不必使用成對的樣本也可以進行圖像翻譯。
圖像翻譯可以理解爲學習一個映射,這個映射可以將源空間X中的圖片轉換成目標空間Y空間中的圖片。
CycleGAN原理
算法的目標是學習從空間X到空間Y的映射,設這個映射爲F。它對應着GAN中的生成器。F可以將X空間的圖片x 轉化爲Y空間中的圖片F(x)。此外還需要使用GAN開判別生成圖是否是真實圖片。
到此一步,根據生成器和判別器構成是損失是與GAN損失是基本相同的。
添加循環損失一致性
但是隻使用上面這個損失是無法訓練的。原因在於沒有成對的數據,映射F可以將所有x都映射爲Y空間的同一張圖片,是損失無效化。
對此,提出循環損失一致性。
我們假設一個映射G,可以把Y空間的圖片y轉換爲X中的圖片G(y)。Cycle同時學習F和G兩個映射,並且要求
F(G(y))≈ y ,以及 G(F(x))≈ x。
這表示我們有空間X轉換到空間Y的圖片,還可以轉換回來。
由此定義循環一致性損失爲:
同時我們也使用GAN損失來判別生成的圖片是否爲真實。
則損失函數變爲:
來源與《21個項目玩轉深度學習》中GAN相關的知識,是知識的摘要和自己的理解,希望多多交流。