參考資料:
1、https://github.com/dragen1860/TensorFlow-2.x-Tutorials
2、《Adversarial Feature Learning》
本次是對閱讀BiGAN論文的一個記錄,包含我自己對於BiGAN的一些理解
因為BiGAN在程式碼實現上沒有很大的不同,甚至類似經典GAN(詳見:https://www.cnblogs.com/DAYceng/p/16365562.html),所以這裡不做介紹
參考1中有原始碼
依然是免責宣告:水平有限,有錯誤請各位指正,謝謝了
注:圖片刷不出來可能需要fq,最近jsdelivr代理好像掛了。
雙向GAN網路(BiGAN)
BiGAN相較於GAN更多的是結構上的改進,除了標準GAN框架中的生成器G,BiGAN還新增了一個編碼器E
結構
整個結構包括三部分:Encode網路(編碼器E),G網路(生成器G),D網路(判別器D)
-
Encode網路,提取原始圖片的隱變數
-
G網路,將噪聲生成圖片
-
D網路,判斷這個資料對(原始圖片和隱變數 生成圖片和噪聲)是來自編碼器E還是生成器G
根據論文的說法:“編碼器E將資料x對映到潛在表徵z”
結合結構圖,“潛在表徵z”應該對應E(x),也就是“真實資料在對應噪聲域下的對映”
文章認為,編碼器E給出的對應編碼具有某種語義特徵,因此E(x)可以被認為是資料x的某種標籤
判別器D在判斷什麼?
這個問題剛開始想會有點奇怪,因為經典的GAN是去判別“輸入資料是不是真實資料”。
而BiGAN中不太一樣,這裡的輸入變成了資料對(【資料,資料在噪聲域下的變換】)
並且在BiGAN中,真實資料從始至終沒有直接輸入過判別器D,也就是說判別器D從來也沒見過真實資料
判別器D所學習到的真實資料的特徵都是編碼器E“告訴”它的
而編碼器E在幹什麼呢?它在學習(提取)真實資料的特徵,這些特徵有可能是更高維度的更抽象的特徵,有可能有助於刻畫原來的真實資料,有可能也沒什麼效果。但是編碼器E是不知道這些的,它只有儘可能的去提取特徵(這就是我們訓練編碼器E的過程)
並且由於我們的生成器G也會生成圖片,這些圖片也有對應的所謂特徵,因為假圖片是由隨機噪聲生成的,那麼隨機噪聲就是這些假圖片的特徵。因此,編碼器E提取的真實圖片的特徵也需要落到與隨機噪聲相同的空間域內,這樣才可以去進行判別。(計算相似度)
那麼現在可以總結一下了:
BiGAN中的判別器D在"區分"當前的輸入究竟是編碼器E給的真實資料的特徵,還是此時生成器G用來生成假圖片的隨機噪聲
編碼器E與生成器G的目的
明白了判別器D在做什麼,現在要理解一下編碼器E和生成器G在幹嘛了
我們會很自然地類比經典GAN得出結論:編碼器E和生成器G在儘可能的欺騙判別器D
為了達到這個目的,編碼器E與生成器G需要不斷接近對方的形式,對應原文中的就是:
we will both argue intuitively and formally prove that the encoder and generator must learn to invert one another in order to fool the BiGAN discriminator.
"編碼器E與生成器G需要學會互相反轉"
通俗一點解釋就是:對於編碼器E來說,雖然它真的是從真實資料中提取特徵,但在不斷訓練的過程中,它也逐漸學習到了生成器G生成圖片的特徵,所以編碼器E會故意模仿假圖片的特徵輸送給判別器D,測試判別器能否分辨出來。
這就是BiGAN的結構圖為什麼把編碼器E和生成器G的輸入輸出框在一起的原因,因為他們之間互相聯絡(是有可能互換的)