生成對(duì)抗網(wǎng)絡(luò)的生成器,gan生成對(duì)抗網(wǎng)絡(luò)應(yīng)用
chanong
來(lái)源:AI有道
本文長(zhǎng)約2820字,建議12分鐘。
在這篇文章中,我們將向大家介紹生成對(duì)抗網(wǎng)絡(luò)(GAN),并用最容易理解的術(shù)語(yǔ)進(jìn)行解釋,最后實(shí)現(xiàn)一個(gè)簡(jiǎn)單的GAN 程序,幫助大家更好地理解它。
什么是癌癥?
GAN非常強(qiáng)大,但是它的模型結(jié)構(gòu)是什么呢?我們之前學(xué)**的機(jī)器學(xué)**或者神經(jīng)網(wǎng)絡(luò)模型主要可以做兩件事。這是我們都熟悉的預(yù)測(cè)和分類。那么,機(jī)械模型能否自動(dòng)生成圖像和聲音呢?并且通過(guò)調(diào)整不同模型的輸入向量,我們可以獲得特定的圖像和聲音。例如,您可以調(diào)整輸入?yún)?shù)以獲得紅發(fā)藍(lán)眼的臉部,也可以調(diào)整輸入?yún)?shù)以獲得女性音頻片段。換句話說(shuō),這樣的機(jī)器模型可以根據(jù)需求自動(dòng)生成所需要的東西。這就是GAN 誕生的地方!
GAN(生成對(duì)抗網(wǎng)絡(luò))主要由兩個(gè)模塊組成。
生成器(生成模型)和判別器模型(判別模型)互相玩游戲,學(xué)**產(chǎn)生非常好的輸出。以攝影為例,生成器的主要任務(wù)是學(xué)**一組真實(shí)圖像,使其生成的圖像接近真實(shí)圖像并“欺騙”鑒別器。判別器的主要任務(wù)是找到生成器產(chǎn)生的圖像,將它們與真實(shí)圖像區(qū)分開(kāi)來(lái),并判斷它們是真還是假。在整個(gè)迭代過(guò)程中,生成器不斷努力使生成的圖像越來(lái)越真實(shí),而鑒別器則不斷努力識(shí)別圖像的真實(shí)性。這類似于生成器和判別器之間的游戲。最終,通過(guò)反復(fù)迭代,兩者會(huì)達(dá)到平衡。生成器產(chǎn)生的圖像將非常接近真實(shí)圖像,但鑒別器將難以識(shí)別真假圖像之間的差異。表現(xiàn)是判別器對(duì)于真假照片的概率輸出接近0.5。
對(duì)GAN 的概念還有點(diǎn)困惑嗎?沒(méi)關(guān)系。請(qǐng)舉一個(gè)生動(dòng)的例子來(lái)解釋。
最近在看黃老師的畫,想畫一些類似的東西,所以就想學(xué)美術(shù)。范主的照片是這樣的。
我只是想畫畫,所以我請(qǐng)了研究黃教授多年作品的王教授來(lái)教我。王教授經(jīng)驗(yàn)豐富,洞察力敏銳,即使是模仿扇子大師的商業(yè)畫也逃不過(guò)他的洞察力。王教授對(duì)我說(shuō): “如果你的照片能騙過(guò)我,就算你成功了!
我很興奮,立刻畫了這張圖給王教授。
王教授淡淡一笑,滿臉黑線,氣得渾身發(fā)抖。 “0分!這也是一幅畫嗎?太不一樣了!”聽(tīng)到王教授的話,我開(kāi)始反思自己。嗯,我絕對(duì)不擅長(zhǎng)畫畫,地上沒(méi)有眼睛鼻子。于是我又畫了一張。
王教授見(jiàn)狀,兩秒內(nèi)就吐出了四個(gè)字。 1分。重畫!當(dāng)我覺(jué)得還是不行或者畫得太爛的時(shí)候,我又研究了范老師的畫風(fēng),不斷改進(jìn)、再創(chuàng)作,有一天我給王老師看了一幅新畫。
王教授看到了,說(shuō)有點(diǎn)像。我需要仔細(xì)看看。最后我還是說(shuō):“不行不行,細(xì)節(jié)太差了!”繼續(xù)重新繪制。哎喲,王教授越來(lái)越嚴(yán)格了!我嘆了口氣,回去繼續(xù)研究,最后把那張非常滿意的畫交給了王教授看。
這時(shí),王教授戴上眼鏡,仔細(xì)地分析了一下,過(guò)了一會(huì)兒,王教授拍拍我的肩膀說(shuō):“畫得真好,真假難辨。” ” 塔。哈哈,我很高興,因?yàn)榈玫搅送趵蠋煹馁潛P(yáng)和肯定,我感覺(jué)自己終于可以像黃老師一樣畫畫了。下一步是考慮換工作。
好的,例子就是這樣(我會(huì)接受你對(duì)我繪畫天賦的抱怨)。這個(gè)例子實(shí)際上是一個(gè)GAN的訓(xùn)練過(guò)程。我是一個(gè)生成器,我的目的是輸出一張可以欺騙王教授的圖片,讓王教授難以辨別真假。王教授是一個(gè)鑒別器,他的目的就是鑒別我的畫,判斷它是不是贗品。整個(gè)過(guò)程就是一個(gè)“生成器對(duì)決”的游戲過(guò)程,最終我(生成器)會(huì)輸出一張“假與真”的圖片,連王教授(識(shí)別者)都難以辨別。
這就是甘。
GAN模型的基本結(jié)構(gòu)
在了解GAN模型之前,我們先來(lái)看看Yann LeCun對(duì)未來(lái)深度學(xué)**關(guān)鍵技術(shù)進(jìn)展的個(gè)人看法。
在我看來(lái),最重要的是對(duì)抗訓(xùn)練(也稱為生成對(duì)抗網(wǎng)絡(luò)的GAN)。這是Ian Goodfellow 最初提出的想法,當(dāng)時(shí)他還是蒙特利爾大學(xué)Yoshua Bengio 的學(xué)生(后來(lái)轉(zhuǎn)到了Google Brain,最近轉(zhuǎn)到了OpenAI)。
在我看來(lái),這個(gè)以及當(dāng)前提出的變體是過(guò)去十年中機(jī)器學(xué)**領(lǐng)域最有趣的想法。
Yann LeCun 認(rèn)為,GAN 很可能會(huì)給深度學(xué)**模型帶來(lái)又一個(gè)重大突破,是過(guò)去20 年來(lái)機(jī)器學(xué)**領(lǐng)域最酷的想法。 GAN 近年來(lái)發(fā)展非常強(qiáng)勁。下圖顯示了最近提交給ICASSP 會(huì)議的所有論文中包含“生成”、“對(duì)抗性”和“強(qiáng)化”關(guān)鍵詞的論文數(shù)量。
數(shù)據(jù)顯示,2018年,包含“生成”和“對(duì)抗性”關(guān)鍵詞的論文數(shù)量急劇增加。不難預(yù)見(jiàn),未來(lái)幾年將會(huì)有更多關(guān)于GAN 的論文。
我們先介紹一下GAN的基本結(jié)構(gòu),我們已經(jīng)知道GAN由生成器和判別器組成,分別記為G和D。以圖像生成應(yīng)用為例,其模型結(jié)構(gòu)如下:
基本的GAN 模型由輸入向量、G 網(wǎng)絡(luò)和D 網(wǎng)絡(luò)組成。其中,G和D一般由神經(jīng)網(wǎng)絡(luò)組成。 G 的輸出是圖像,但采用全連接格式。 G的輸出是D的輸入,其中也包含實(shí)際的樣本集。這樣,D嘗試為真實(shí)樣本輸出較高的分?jǐn)?shù),為G生成的樣本輸出較低的分?jǐn)?shù)。在循環(huán)的每次迭代中,G網(wǎng)絡(luò)不斷優(yōu)化網(wǎng)絡(luò)參數(shù),使得D不再能區(qū)分真假,但D網(wǎng)絡(luò)也不斷優(yōu)化網(wǎng)絡(luò)參數(shù)以提高識(shí)別能力,這就造成了網(wǎng)絡(luò)參數(shù)之間的差距。真樣本分?jǐn)?shù)和假樣本分?jǐn)?shù)。
經(jīng)過(guò)多次訓(xùn)練迭代,最終建立了GAN模型。
最終的GAN模型中,G生成的樣本有假有真,D輸出的分?jǐn)?shù)接近0.5,因此很難區(qū)分真假樣本,訓(xùn)練成功。
這里我們將解釋輸入向量。輸入向量是用來(lái)做什么的?實(shí)際上,輸入向量的每個(gè)維度都可以代表輸出圖像的特定特征。例如,您可以輸入向量第一維的值來(lái)調(diào)整生成圖像中的頭發(fā)顏色。值越高,顏色越紅;值越低,顏色越黑。您可以通過(guò)在向量的第二維中輸入值來(lái)調(diào)整膚色。通過(guò)輸入生成的圖像矢量,您可以使用3D 值調(diào)整生成圖像的面部表情和情緒。
這就是GAN的強(qiáng)大之處;通過(guò)調(diào)整輸入向量,可以生成具有各種特征的圖像。這些生成的圖像不是實(shí)際樣本集的一部分,而是合理但看不見(jiàn)的圖像。是不是很有趣?下圖顯示不同的向量產(chǎn)生不同的圖像。
解釋完GAN模型,我們來(lái)快速了解一下GAN的算法原理。由于有G和D兩個(gè)模塊,每個(gè)模塊都有對(duì)應(yīng)的網(wǎng)絡(luò)參數(shù)。
我們先來(lái)看D模塊,它的目標(biāo)是讓實(shí)際樣本得分盡可能大,而G產(chǎn)生的樣本得分盡可能小。 D的損失函數(shù)可以如下獲得。
其中,x為實(shí)際樣本,G(z)為G生成的樣本。我們希望D(x) 更大,并且我們希望D(G(z)) 更小。也就是說(shuō),我們希望-D(x)盡可能小,并且-log(1-D(G(z)))越小越好。從損失函數(shù)的角度來(lái)看,我們得到上面的公式。
再看看G模塊,它的目標(biāo)是希望自己生產(chǎn)的模型能夠在D上取得更高的分?jǐn)?shù)。則G的損失函數(shù)可得:
一旦了解了損失函數(shù),您就可以使用各種優(yōu)化算法來(lái)訓(xùn)練模型。
創(chuàng)建GAN 模型
接下來(lái),使用PyTorch 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的GAN 模型。作為創(chuàng)建繪畫的示例,假設(shè)您創(chuàng)建了以下“名畫”(以正弦圖為例)。
生成這幅“藝術(shù)畫”的代碼是:
def Artist_works(): # 著名藝術(shù)家的畫作(實(shí)際目標(biāo))
r=0.02 * np.random.randn(1, ART_COMPONENTS)
繪畫=np.sin(PAINT_POINTS * np.pi) + r
繪畫=torch.from_numpy(painting).float()
歸還畫作
接下來(lái),我們分別定義G網(wǎng)絡(luò)模型和D網(wǎng)絡(luò)模型。
G=nn.Sequential( # 生成器
nn.Linear(N_IDEAS, 128),隨機(jī)想法的數(shù)量(可能來(lái)自正態(tài)分布)
ReLU(),
nn.Linear(128, ART_COMPONENTS), # 根據(jù)這些隨機(jī)想法創(chuàng)作繪畫
)
D=nn.Sequential( # 標(biāo)識(shí)符
nn.Linear(ART_COMPONENTS, 128), # 接收來(lái)自著名藝術(shù)家或像G 這樣的初學(xué)者的藝術(shù)作品
ReLU(),
nn.線性(128, 1),
nn.Sigmoid(), # 告訴藝術(shù)品是由藝術(shù)家創(chuàng)作的概率
)
設(shè)置Adam 算法進(jìn)行優(yōu)化。
opt_D=torch.optim.Adam(D.parameters(), lr=LR_D)
opt_G=torch.optim.Adam(G.parameters(), lr=LR_G)
最后,我們構(gòu)建了一個(gè)GAN迭代訓(xùn)練流程。
plt.ion() # 關(guān)于連續(xù)圖的一些事情
D_loss_history=[]
G_loss_history=[]
對(duì)于(10000): 范圍內(nèi)的步長(zhǎng)
Artist_paintings=Artist_works() # 藝術(shù)家的真實(shí)畫作
G_ideas=torch.randn(BATCH_SIZE, N_IDEAS) # 隨機(jī)想法
G_paintings=G(G_ideas) # G 的假畫(隨機(jī)想法)
prob_artist0=D(artist_paintings) # D 讓我們?cè)黾舆@個(gè)概率
prob_artist1=D(G_paintings) # D 讓我們嘗試降低這個(gè)概率
D_loss=- torch.mean(torch.log(prob_artist0) + torch.log(1. - prob_artist1))
G_loss=torch.mean(torch.log(1.-prob_artist1))
D_loss_history.append(D_loss)
G_loss_history.append(G_loss)
opt_D.zero_grad()
D_loss.backward(retain_graph=True) # 重用計(jì)算圖
opt_D.step()
opt_G.zero_grad()
G_loss.backward()
opt_G.step()
if 步驟% 50==0: # 繪圖
plt.cla()
plt.plot(PAINT_POINTS[0], G_paintings.data.numpy()[0], c='#4AD631', lw=3, label='生成的油漆',)
plt.plot(PAINT_POINTS[0], np.sin(PAINT_POINTS[0] * np.pi), c='#74BCFF', lw=3, label='標(biāo)準(zhǔn)曲線')
plt.text(-1, 0.75, 'D 精度=%.2f (D 收斂為0.5)' % prob_artist0.data.numpy().mean(), fontdict={'size': 8})
plt.text(-1, 0.5, 'D 分?jǐn)?shù)=%.2f (-1.38 表示G 收斂)' % -D_loss.data.numpy(), fontdict={'size': 8})
plt.ylim((-1, 1));plt.legend(loc='右下角', fontsize=10);plt.draw();plt.pause(0.01)
plt.ioff()
plt.show()
我們使用動(dòng)態(tài)繪圖,以便更容易地不斷觀察GAN 模型的訓(xùn)練狀態(tài)。
如果迭代次數(shù)為1:
如果迭代次數(shù)為200:
如果迭代次數(shù)為1000:
如果迭代次數(shù)為10000:
完美!經(jīng)過(guò)10,000 次訓(xùn)練迭代后,生成的曲線非常接近標(biāo)準(zhǔn)曲線。正如預(yù)期,D 的分?jǐn)?shù)接近0.5。
完整的代碼有.py 和.ipynb 版本,可以通過(guò)搜索下面的鏈接找到。
https://github.com/RedstoneWill/MachineLearningInAction/tree/master/GAN








