天天看點

圖像生成 GAN

GAN的基本原理其實非常簡單,這裡以生成圖檔為例進行說明。假設我們有兩個網絡,G(Generator)和D(Discriminator)。正如它的名字所暗示的那樣,它們的功能分别是:

G是一個生成圖檔的網絡,它接收一個随機的噪聲z,通過這個噪聲生成圖檔,記做G(z)。

D是一個判别網絡,判别一張圖檔是不是“真實的”。它的輸入參數是x,x代表一張圖檔,輸出D(x)代表x為真實圖檔的機率,如果為1,就代表100%是真實的圖檔,而輸出為0,就代表不可能是真實的圖檔。

在訓練過程中,生成網絡G的目标就是盡量生成真實的圖檔去欺騙判别網絡D。而D的目标就是盡量把G生成的圖檔和真實的圖檔分别開來。

在最理想的狀态下,G可以生成足以“以假亂真”的圖檔G(z)。對于D來說,它難以判定G生成的圖檔究竟是不是真實的,是以D(G(z)) = 0.5。

用随機梯度下降法訓練D和G

DCGAN(Deep Convolutional Generative Adversarial Networks)的原理和GAN是一樣的,這裡就不在贅述。它隻是把上述的G和D換成了兩個卷積神經網絡(CNN)。

https://zhuanlan.zhihu.com/p/24767059

代碼

https://github.com/carpedm20/DCGAN-tensorflow

GAN應用到一些場景上,比如圖檔風格遷移,超分辨率,圖像補全,去噪,避免了損失函數設計的困難,不管三七二十一,隻要有一個的基準,直接上判别器,剩下的就交給對抗訓練了。

GAN不适合處理文本資料

https://blog.csdn.net/qq_25737169/article/details/78857724

1、将pooling層convolutions替代,其中,在discriminator上用strided convolutions替代,在generator上用fractional-strided convolutions(即deconvolution)替代。

2、在generator和discriminator上都使用batchnorm。 

解決初始化差的問題

幫助梯度傳播到每一層

防止generator把所有的樣本都收斂到同一個點。

直接将BN應用到所有層會導緻樣本震蕩和模型不穩定,通過在generator輸出層和discriminator輸入層不采用BN可以防止這種現象。

3、移除全連接配接層 

global pooling增加了模型的穩定性,但傷害了收斂速度。

4、在generator的除了輸出層外的所有層使用ReLU,輸出層采用tanh。

5、在discriminator的所有層上使用LeakyReLU。

https://blog.csdn.net/stdcoutzyx/article/details/53872121

在DCGAN中,G的網絡結構是需要進行up-sample , 是以使用的“de-convolution”層,而對于D則是比較普遍的卷基層進行下采樣。

https://blog.csdn.net/u011534057/article/details/54845673