文章目錄
簡介
上節講了GAN,GAN的主要作用是用來做生成對象,輸入向量,得到對應的對象,但是生成的對象無法控制,因此本節來討論如何考慮控制生成對象。Conditional GAN和GAN的Generator是一樣的,差別就是在Discriminator。
公式輸入請參考:在線Latex公式
先來看個文字生成圖片的例子:
Text-to-Image
Traditional supervised approach
用傳統的做法來怎麼做?• Traditional supervised approach
以上是數據的例子,我們訓練一個NN,然後輸入一個文字,輸出對應一個圖片,我們希望圖片與目標圖片越接近越好。
這樣做有什麼問題?我們來看一下,例如文字:train對應的圖片有很多張。例如下面的火車有正面,有側面的,如果用傳統的NN來訓練,模型會想讓火車長得像左邊,又像一個右邊的,這樣的結果是不好的。模型會想產生多張圖像的平均,結果就會很模糊。
Normal GAN
如果是用GAN來做:
先用Generator來生成圖片,輸入是兩個:一個是條件,一個是從某個分佈中sample出來的向量。
然後Discriminator來判斷圖片是否是生成的:
Generator will learn to generate realistic images ….
But completely ignore the input conditions.
這樣做是有問題的,因爲Discriminator只會根據生成的圖片是否清晰,是否真實來進行判別,所以Generator 只會按這個標準來生成圖片,而沒有去按條件(例如:火車)來生成圖片。
Conditional GAN
因此要改進爲Conditional GAN,這個時候Generator的部分不變,但是Discriminator要改爲:
這裏的Discriminator吃兩個輸入:一個是條件,一個是要判斷的圖片對象。輸出是一個向量,輸出向量要判斷兩個事情:
x is realistic or not + c and x are matched or not
下面是輸出向量的例子:
算法
·In each training iteration:
Learning Discriminator
·Sample positive examples from database. 這裏是Conditional GAN所以每個樣本包含兩個東西,都是image和text的pair。這個是真實樣本,要給高分的
·Sample noise samples from a distribution
·Obtaining generated data .這裏是生成對象,要給低分
·Sample objects from database
·Update discriminator parameters to maximize
這裏和上節中的GAN算法就是多了最後一項,就是圖片和文本不對應也是給低分。
Learning Generator
·Sample noise samples from a distribution
·Sample conditions from a database
·Update generator parameters to maximize
Conditional GAN - Discriminator
常見的Discriminator構架如下圖,把x丟到一個NN裏面得到一個向量表示,然後把文字丟到一個NN裏面得到一個向量表示,把兩個向量concat起來之後,丟到一個NN裏面得到具體的分數。
但是有三個文章提出來的Discriminator構架貌似效果也還不錯:
感覺有點像之前講的魔主化的東西。把一個x丟到一個NN裏面,出來一個結果:x是否是真實對象。另外還出來一個向量表示(embedding),然後把條件文本和剛纔的向量表示丟到另外一個NN(這個NN同時看到兩個東西)裏面,得到對象和文本是否匹配的結果。
比起上面模型而言,上面模型雖然能work,但是給出的分數並沒有告訴我們爲什麼得到這個分數。下面的模型則可以看出來,是不匹配,還是生成對象有問題。
[ Augustus Odena et al., ICML,2017]
[ Takeru Miyato, et al., ICLR,2018]
[ Han Zhang, et al., arXiv,2017]
作業實例
學生做的效果:
可以看到裏面有些圖片翻車,右下角那個圖片的眼睛一個紅一個藍。
Stack GAN
先生成小圖,再生成大圖。
大概流程:先有一個Generator1吃文字描述(先要embedding變成)生成一個64×64的小圖片,然後經過一個Discriminator1,判斷小圖片和文字是否匹配,如果匹配,進入Generator2,吃小圖片和,然後得到大圖片,然後經過一個Discriminator2,判斷大圖片和文字是否匹配
文獻:Han Zhang, Tao Xu, Hongsheng Li, Shaoting Zhang, Xiaogang Wang, Xiaolei Huang, Dimitris Metaxas, “StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks”, ICCV, 2017
可以把以上過程重複多次,有論文生成1024×1024的超級大圖。
Image-to-image
可以有很多用途,白天變黑夜,黑白變彩色等,例子:
文獻:https://arxiv.org/pdf/1611.07004
傳統做法
先收集大量的樣本:
然後訓練模型:
在測試的結果卻很模糊,原因在上面有講:It is blurry because it is the average of several images.
Conditional GAN
Generator:
Discriminator,這裏注意要吃兩個東西,條件和要判斷的對象:
看到使用條件GAN生成的結果更加清晰了,但是這裏有點問題,就是左上角那裏多了一些東西
因此可以針對這個進行改進,在Generator生成對象的時候加上限制,要使得生成的對象與真實對象越接近越好:
最後結果:
Patch GAN
當用一個Discriminator來進行評估整個大張的圖片的時候會有很多問題:容易overfitting,訓練時間長。因此可以用多個Discriminator來進行評估。每個Discriminator檢查的區域的大小是超參數。不能太小例如一個pixel那麼整個圖片就會糊掉。
文獻:https://arxiv.org/pdf/1611.07004.pdf
Speech Enhancement
給一段聲音去掉噪音
傳統做法
先要有數據:
然後訓練一個NN,注意這裏會直接套CNN
效果當然不好,要用條件GAN
Conditional GAN
Generator:
Discriminator:
Video Generation
看一段影片,然後預測接下來發生什麼事情。
還有用GAN來玩遊戲,如果不用GAN,就是會有問題,例如角色往左或者往右都是正確的,那麼用傳統的學習得到的結果就是進行平均,然後角色就會定住不動。