基于生成對(duì)抗網(wǎng)絡(luò)(GAN)的圖片生成器及其應(yīng)用_第1頁(yè)
基于生成對(duì)抗網(wǎng)絡(luò)(GAN)的圖片生成器及其應(yīng)用_第2頁(yè)
基于生成對(duì)抗網(wǎng)絡(luò)(GAN)的圖片生成器及其應(yīng)用_第3頁(yè)
基于生成對(duì)抗網(wǎng)絡(luò)(GAN)的圖片生成器及其應(yīng)用_第4頁(yè)
基于生成對(duì)抗網(wǎng)絡(luò)(GAN)的圖片生成器及其應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩32頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

IV目錄1緒論 11.1選題目的 11.2選題意義 11.3研究現(xiàn)狀及發(fā)展趨勢(shì) 11.4研究方法及應(yīng)用領(lǐng)域 21.5論文組織結(jié)構(gòu) 42開發(fā)環(huán)境和相關(guān)技術(shù)棧 52.1生成對(duì)抗網(wǎng)絡(luò)(GAN)原理綜述 52.1.1生成器工作原理 52.1.2判別器工作原理 62.1.3生成對(duì)抗網(wǎng)絡(luò)(GAN)工作原理 72.2卷積神經(jīng)網(wǎng)絡(luò)原理 72.3激活函數(shù)原理 82.4損失函數(shù)原理 82.5優(yōu)化器原理 92.6本系統(tǒng)生成對(duì)抗網(wǎng)絡(luò)(GAN)模型的選用 92.7本系統(tǒng)深度學(xué)習(xí)框架的選用 102.8本系統(tǒng)Web開發(fā)框架的選用 113需求分析與系統(tǒng)設(shè)計(jì) 123.1功能需求分析 123.2功能實(shí)現(xiàn)方案 133.2.1Pytorch深度學(xué)習(xí)框架設(shè)計(jì)生成對(duì)抗網(wǎng)絡(luò) 133.2.2Flaskweb開發(fā)框架設(shè)計(jì)前端頁(yè)面 143.3系統(tǒng)使用的流程 144測(cè)試與試驗(yàn)分析 164.1數(shù)據(jù)載入與數(shù)據(jù)預(yù)處理 164.2生成器模型架構(gòu)代碼實(shí)現(xiàn) 174.3判別器模型架構(gòu)代碼實(shí)現(xiàn) 184.4訓(xùn)練模型代碼實(shí)現(xiàn) 194.5模型生成圖片代碼實(shí)現(xiàn) 214.6本系統(tǒng)選用DCGAN模型與傳統(tǒng)GAN模型的性能對(duì)比 225基于Flask框架的網(wǎng)站開發(fā)設(shè)計(jì)與效果展示 245.1網(wǎng)頁(yè)界面設(shè)計(jì) 245.2系統(tǒng)功能結(jié)構(gòu) 245.3系統(tǒng)功能實(shí)現(xiàn) 245.3.1導(dǎo)航欄切換頁(yè)面代碼實(shí)現(xiàn) 255.3.2數(shù)據(jù)集查閱代碼實(shí)現(xiàn) 265.3.3圖片生成代碼實(shí)現(xiàn) 265.4效果展示 285.4.1數(shù)據(jù)集管理功能展示 285.4.2圖片生成功能展示 296總結(jié) 30參考文獻(xiàn) 31致謝 32PAGEPAGE7緒論本章綜述選題的目的、研究意義、研究現(xiàn)狀及發(fā)展趨勢(shì)、研究方法及應(yīng)用領(lǐng)域,并且介紹本文的內(nèi)容與組織結(jié)構(gòu)。1.1選題目的基于生成對(duì)抗網(wǎng)絡(luò)(GAN)強(qiáng)大的圖片生成能力,可以生成可用性很高的圖像,同時(shí)不用假設(shè)很多數(shù)學(xué)條件,實(shí)踐過(guò)程中也不用知道真實(shí)數(shù)據(jù)的特征分布,很多工程和學(xué)術(shù)領(lǐng)域可以應(yīng)用生成對(duì)抗網(wǎng)絡(luò)(GAN)的圖片生成能力,對(duì)實(shí)驗(yàn)中數(shù)據(jù)量不充足的樣本集進(jìn)行數(shù)量上的補(bǔ)充,然后將混合樣本集作為其他視覺(jué)任務(wù)的數(shù)據(jù)集,從而達(dá)到增強(qiáng)模型學(xué)習(xí)效果的目的(史丹青,2018)。筆者將基于對(duì)生成對(duì)抗網(wǎng)絡(luò)(GAN)的學(xué)習(xí),實(shí)現(xiàn)一個(gè)根據(jù)已有圖片生成新圖片的圖片生成系統(tǒng)。1.2選題意義機(jī)器能夠從海量的數(shù)據(jù)和知識(shí)中進(jìn)行學(xué)習(xí),通過(guò)研究數(shù)據(jù)分析它們的特征尋找相關(guān)規(guī)律,并根據(jù)得到的規(guī)律建構(gòu)模型,模型可以對(duì)未出現(xiàn)過(guò)的數(shù)據(jù)進(jìn)行預(yù)測(cè),從而在一定程度上具備了人的能力(陳海紅,2017)。在目前的深度學(xué)習(xí)任務(wù)中,大量的數(shù)據(jù)和機(jī)器計(jì)算能力的提升幫助深度學(xué)習(xí)模型提升了在相關(guān)任務(wù)中的表現(xiàn),但是仍然有許多項(xiàng)目難以得到充足的數(shù)據(jù)。研究者們希望確保任務(wù)的完成,但面臨數(shù)據(jù)不足的問(wèn)題。傳統(tǒng)方法通過(guò)顏色和幾何變換擴(kuò)充數(shù)據(jù),但數(shù)據(jù)量實(shí)質(zhì)上未增加。使用GAN的生成方法為解決這一問(wèn)題提供了有效思路。生成對(duì)抗網(wǎng)絡(luò)(GAN)是深度學(xué)習(xí)在人工智能方向上的又一大的進(jìn)步。1.3研究現(xiàn)狀及發(fā)展趨勢(shì)近年來(lái),通過(guò)數(shù)據(jù)量的積累、計(jì)算機(jī)性能的提高和科研者在神經(jīng)網(wǎng)絡(luò)的探索,深度學(xué)習(xí)的發(fā)展非常迅速。GAN吸引了眾多研究者,成為研究的焦點(diǎn)。受博弈論啟發(fā),通過(guò)對(duì)抗訓(xùn)練生成高質(zhì)量樣本,具有強(qiáng)大的特征表達(dá)和學(xué)習(xí)能力,比傳統(tǒng)機(jī)器學(xué)習(xí)更強(qiáng)大。在計(jì)算機(jī)視覺(jué)領(lǐng)域,GAN取得了顯著的成功。每年都有大量與GAN相關(guān)的論文問(wèn)世,涉及到GAN模型的改進(jìn)、應(yīng)用場(chǎng)景探索以及理論方面的深入研究。這些研究不僅推動(dòng)了GAN技術(shù)的發(fā)展,也為相關(guān)領(lǐng)域的創(chuàng)新注入了活力,使得GAN在學(xué)術(shù)界和工業(yè)界都備受關(guān)注,并為未來(lái)的研究和應(yīng)用奠定了堅(jiān)實(shí)的基礎(chǔ)。雖然GAN有許多優(yōu)點(diǎn),但也存在明顯的缺陷,在訓(xùn)練中模型參數(shù)振蕩、不穩(wěn)定的情況。網(wǎng)絡(luò)難以收斂,反復(fù)出現(xiàn)訓(xùn)練崩塌的情況。生成的樣本會(huì)遇到缺乏多樣性,生成樣本之間有著高度相似性的情況。針對(duì)這些問(wèn)題,研究人員發(fā)明了很多GAN的變形模型(梁俊杰,2020),如下:WGAN模型:Arjovsky等人發(fā)明了WGAN(WassersteinGenerativeAdversarialNetworks)模型,通過(guò)引入Wasserstein間距,解決了經(jīng)典GAN模型中存在的訓(xùn)練不穩(wěn)定、梯度消失的問(wèn)題,其穩(wěn)定的訓(xùn)練過(guò)程和更高質(zhì)量的生成樣本受到了廣泛的關(guān)注,為生成對(duì)抗網(wǎng)絡(luò)(GAN)領(lǐng)域帶來(lái)了重要的進(jìn)展。MGAN模型:Hoang等人發(fā)明了MGAN(Multi-GeneratorAdversarialNetworks)模型,其最主要的特點(diǎn)是在GAN中構(gòu)建多個(gè)生成器緩解模式丟失的問(wèn)題,MGAN最直接的理論是構(gòu)建更多的生成器,以生成種類更多的樣本。MGAN的引入使得GAN模型更好地適應(yīng)多模態(tài)數(shù)據(jù)的生成任務(wù),擴(kuò)展了GAN在數(shù)據(jù)生成領(lǐng)域的應(yīng)用范圍,它為處理多模態(tài)數(shù)據(jù)供應(yīng)了新的解決方法。CGAN模型:Mirza等人提出了CGAN(ConditionalGenerativeAdversarialNetworks)模型,把額外條件加入到生成器和判別器,用于指導(dǎo)生成樣本,廣大研究者證明CGAN非常有效,并將它廣泛應(yīng)用到相關(guān)研究。CGAN的引入使得GAN模型具有了更強(qiáng)大的靈活性和可控性,能夠更好地適應(yīng)各種需求和適應(yīng)各種應(yīng)用場(chǎng)景,它為生成對(duì)抗網(wǎng)絡(luò)處理?xiàng)l件生成任務(wù)提供了一種有效的方法。DCGAN模型:卷積神經(jīng)網(wǎng)絡(luò)CNN(ConvolutionalNeuralNetworks)是處理網(wǎng)格數(shù)據(jù)的模型。它在有監(jiān)督學(xué)習(xí)中的各項(xiàng)研究中都發(fā)揮著重要的作用,但它在無(wú)監(jiān)督學(xué)習(xí)的領(lǐng)域中的表現(xiàn)卻不盡人意。DCGAN(DeepConvolutionGenerativeAdversarialNetworks)模型將CNN和GAN結(jié)合到一起,它利用CNN實(shí)現(xiàn)生成器和判別器的網(wǎng)絡(luò)模型,通過(guò)使用卷積神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)和對(duì)抗訓(xùn)練機(jī)制,能夠生成高質(zhì)量的圖片樣本,現(xiàn)已被廣泛應(yīng)用于圖像合成、圖像增強(qiáng)和圖像編輯等諸多領(lǐng)域,它已成為生成圖片領(lǐng)域重要的里程碑之一。1.4研究方法及應(yīng)用領(lǐng)域生成對(duì)抗網(wǎng)絡(luò)的研究方法涉及到多個(gè)方面,包括網(wǎng)絡(luò)架構(gòu)的設(shè)計(jì)、訓(xùn)練過(guò)程的優(yōu)化、應(yīng)用領(lǐng)域的探索等。在設(shè)計(jì)網(wǎng)絡(luò)架構(gòu)時(shí)選擇適當(dāng)?shù)木W(wǎng)絡(luò)結(jié)構(gòu)作為生成器和判別器的基礎(chǔ),使用深層結(jié)構(gòu)或殘差連接來(lái)增加網(wǎng)絡(luò)的深度,有助于更好地捕捉數(shù)據(jù)的復(fù)雜特征。生成對(duì)抗網(wǎng)絡(luò)的焦點(diǎn)是對(duì)抗損失,確保生成器生成的樣本越來(lái)越難被判別器判別為假。使用穩(wěn)定的優(yōu)化算法可以提高訓(xùn)練的穩(wěn)定性。使用批次歸一化、權(quán)重正則化等技術(shù)來(lái)防止訓(xùn)練過(guò)程中的模式崩潰或梯度爆炸問(wèn)題。GAN的最基本應(yīng)用是生成一張近乎真實(shí)的圖片,后續(xù)可以根據(jù)生成器的特性應(yīng)用到更多領(lǐng)域(程顯毅,2019),具體應(yīng)用如下:圖像超分辨率:目標(biāo)旨在將低分辨率圖片轉(zhuǎn)換為高分辨率圖片,通過(guò)學(xué)習(xí)圖片的細(xì)節(jié)和紋理,激勵(lì)生成器生成更細(xì)致和真實(shí)的圖像,從而提高圖片的可用性并提高圖片的質(zhì)量。藝術(shù)風(fēng)格遷移:該應(yīng)用能夠?qū)⒁环鶊D片的內(nèi)容與另一幅圖片的風(fēng)格相結(jié)合,生成具有新風(fēng)格的圖片。這個(gè)領(lǐng)域的核心思想是使用上次都看完了訓(xùn)練一個(gè)生成器,使得其能夠生成具有指定風(fēng)格的圖片,同時(shí)保留原始圖片的內(nèi)容。通過(guò)這種方法,生成對(duì)抗網(wǎng)絡(luò)可以實(shí)現(xiàn)藝術(shù)風(fēng)格遷移,生成具有指定藝術(shù)風(fēng)格的圖片,該方法在藝術(shù)創(chuàng)作、圖片編輯和設(shè)計(jì)等領(lǐng)域有非常廣泛的應(yīng)用前景。通過(guò)文本描述生成圖片:這種技術(shù)可以通過(guò)對(duì)文本描述的學(xué)習(xí)與相關(guān)圖片建立關(guān)系,使得模型能夠根據(jù)輸入的文本描述生成與描述相符的圖片,這項(xiàng)應(yīng)用是很有前景。醫(yī)學(xué)圖像分析:通過(guò)訓(xùn)練生成對(duì)抗網(wǎng)絡(luò)模型,可以將低質(zhì)量的醫(yī)學(xué)圖像轉(zhuǎn)換為高質(zhì)量的圖像,提高圖像的可視化質(zhì)量和提高醫(yī)生診斷的準(zhǔn)確性。生成對(duì)抗網(wǎng)絡(luò)可以用于合成具有特定病變、結(jié)構(gòu)或特征的醫(yī)學(xué)圖像,以擴(kuò)充醫(yī)學(xué)圖像的數(shù)據(jù)集,幫助提高醫(yī)學(xué)圖像分析模型的魯棒性和泛化能力,尤其在數(shù)據(jù)稀缺或難以獲取的情況下尤為重要。生成對(duì)抗網(wǎng)絡(luò)對(duì)醫(yī)學(xué)影像有著非常重要的推動(dòng)作用。隨著技術(shù)的不停發(fā)展,生成對(duì)抗網(wǎng)絡(luò)在醫(yī)學(xué)圖像分析中的應(yīng)用十分廣闊。本系統(tǒng)GAN的構(gòu)建使用Pytorch深度學(xué)習(xí)開發(fā)框架,前端使用Flaskweb開發(fā)框架。本系統(tǒng)向用戶提供了兩項(xiàng)主要的功能:基于已訓(xùn)練好的模型生成新圖片,這個(gè)功能可以用于許多應(yīng)用,如圖像編輯、藝術(shù)創(chuàng)作等。用戶可以通過(guò)簡(jiǎn)單的操作就能夠生成具有特定特征或風(fēng)格的圖像。;用戶上傳訓(xùn)練集調(diào)用本系統(tǒng)已搭建好的模型訓(xùn)練框架用來(lái)訓(xùn)練用戶期望的生成模型,通過(guò)這個(gè)功能,用戶可以訓(xùn)練出符合自己需求的圖像生成模型,滿足特定的任務(wù)或應(yīng)用需求。在前端開發(fā)方面,系統(tǒng)需要實(shí)現(xiàn)網(wǎng)頁(yè)頁(yè)面的設(shè)計(jì)與展示,以及與用戶的人機(jī)交互功能。這包括了設(shè)計(jì)用戶友好的界面、實(shí)現(xiàn)用戶輸入數(shù)據(jù)的傳遞與處理、接收用戶的操作指令并向后端發(fā)送相應(yīng)請(qǐng)求等。在后端開發(fā)方面,系統(tǒng)需要處理訓(xùn)練集圖像的預(yù)處理工作,包括圖像的讀取、格式轉(zhuǎn)換、數(shù)據(jù)增強(qiáng)等。然后,系統(tǒng)需要構(gòu)建生成對(duì)抗網(wǎng)絡(luò)(GAN)等模型,并利用用戶提供的訓(xùn)練數(shù)據(jù)進(jìn)行模型的訓(xùn)練。訓(xùn)練好的模型需要進(jìn)行存儲(chǔ),以備后續(xù)的應(yīng)用和使用。最后,系統(tǒng)需要提供接口或服務(wù),接收前端傳遞的用戶請(qǐng)求,并根據(jù)用戶需求生成新的圖像,并將生成的圖像返回給前端展示給用戶。1.5論文組織結(jié)構(gòu)第一章:綜述選題的目的、研究意義,研究現(xiàn)狀及發(fā)展趨勢(shì)、研究方法及應(yīng)用領(lǐng)域,并且介紹本文的內(nèi)容與組織結(jié)構(gòu)。第二章:綜述本系統(tǒng)的開發(fā)環(huán)境和相關(guān)技術(shù)棧。第三章:綜述本系統(tǒng)的需求分析和系統(tǒng)設(shè)計(jì)。第四章:綜述本系統(tǒng)所使用的生成器的詳細(xì)設(shè)計(jì)和代碼實(shí)現(xiàn)。第五章:綜述本系統(tǒng)所使用的Flask框架并展示系統(tǒng)效果。第六章:對(duì)本系統(tǒng)進(jìn)行總結(jié)。開發(fā)環(huán)境和相關(guān)技術(shù)棧本章綜述本系統(tǒng)使用的開發(fā)環(huán)境和相關(guān)技術(shù)棧包括如下:生成對(duì)抗網(wǎng)絡(luò)(GAN)原理綜述、生成器工作原理、判別器工作原理、生成對(duì)抗網(wǎng)絡(luò)(GAN)工作原理、卷積神經(jīng)網(wǎng)絡(luò)原理、激活函數(shù)原理、損失函數(shù)原理、優(yōu)化器原理、生成對(duì)抗網(wǎng)絡(luò)(GAN)模型的選用、深度學(xué)習(xí)框架的選用、Web開發(fā)框架的選用。2.1生成對(duì)抗網(wǎng)絡(luò)(GAN)原理綜述生成對(duì)抗網(wǎng)絡(luò)(GAN)是一種深度學(xué)習(xí)模型,該模型由lanGoodfellow等人于2014年提出,是近年來(lái)在龐大分布上無(wú)監(jiān)督學(xué)習(xí)最具前景的方式之一(lanGoodfellow,2014)。核心思想是博弈論的納什均衡,通過(guò)兩個(gè)模塊:生成器和判別器,生成器致力于生成逼真樣本。判別器致力于準(zhǔn)確地區(qū)分樣本的真假,隨著時(shí)間推移,判別器更善于辨別樣本,生成器逐漸提高生成質(zhì)量。大致的GAN架構(gòu),如圖2.1所示:圖2.1GAN架構(gòu)2.1.1生成器工作原理生成器接收一個(gè)隨機(jī)向量作為輸入,這個(gè)輸入通常是從一個(gè)預(yù)定于的潛在空間中得到的,這個(gè)潛在空間可以是任意維度的向量空間,使得生成器可以從中學(xué)習(xí)到數(shù)據(jù)的分布特征。輸入的隨機(jī)向量經(jīng)過(guò)生成器的多層神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),逐步被轉(zhuǎn)換成更高維度的表示。在這個(gè)過(guò)程中,向量在生成器中通過(guò)一系列的線性變換、非線性激活函數(shù)以及批量歸一化等操作,被映射了到一個(gè)高維空間中。經(jīng)過(guò)多層神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的轉(zhuǎn)換,最終生成器會(huì)輸出一個(gè)與真實(shí)數(shù)據(jù)樣本相似的偽造數(shù)據(jù)樣本。在本系統(tǒng)中高維向量指的是一個(gè)四維數(shù)組(batch_size,channels,height,width)其中‘batch_size’代表批量的大小、‘channels’代表圖片的通道數(shù)、‘height’和‘width’代表圖片的高度和寬度。本系統(tǒng)構(gòu)造的圖片均采取RGB圖片格式,所以該高維向量對(duì)應(yīng)的每個(gè)像素都有三個(gè)通道的取值在[0,1]之間(將0-255的int取值規(guī)范到0-1的float取值),生成器生成的高維向量作為彩色圖片被展示出來(lái)。生成器的工作原理是通過(guò)一個(gè)隨機(jī)的低維度輸入向量映射到一個(gè)高緯度的數(shù)據(jù)樣本空間,生成器可以學(xué)習(xí)到真實(shí)圖片的特征分布,并生成具有一定可信度的假圖片。大致的生成器架構(gòu),如圖2.2所示:圖2.2生成器架構(gòu)2.1.2判別器工作原理判別器作為GAN的重要組件,負(fù)責(zé)判斷樣本的真實(shí)性。在訓(xùn)練中,樣本來(lái)源于生成的樣本或真實(shí)樣本。樣本通過(guò)一系列的卷積操作、池化操作和激活函數(shù)等操作,這些操作提取樣本中關(guān)鍵的特征,這些特征包括圖片的紋理、邊緣、形狀等。特征提取后,判別器將提取的特征信息輸入分類器中進(jìn)行分類,分類器通常是一個(gè)全連接層,它將提取到的特征映射到一個(gè)單一的數(shù)值范圍內(nèi),通常是[0,1]之間,代表樣本被判斷是真實(shí)樣本的概率。如果輸入的樣本是真實(shí)的樣本,則該概率值應(yīng)該接近于1;如果輸入的樣本是生成器生成的樣本,則該概率值應(yīng)該接近于0。在訓(xùn)練的過(guò)程中,判別器的目標(biāo)是最大化真實(shí)樣本的概率值,并最小化生成樣本的概率值。通過(guò)上述步驟,判別器對(duì)樣本進(jìn)行分類的能力得到增強(qiáng),進(jìn)而生成器生成近乎真實(shí)樣本的能力也得到增強(qiáng)。隨著網(wǎng)絡(luò)訓(xùn)練的不斷進(jìn)行,生成器所生成的樣本質(zhì)量會(huì)不斷得到提高,生成樣本的可用性提高后,樣本能夠被研究者們所使用。大致的判別器架構(gòu),如圖2.3所示:圖2.3判別器架構(gòu)2.1.3生成對(duì)抗網(wǎng)絡(luò)(GAN)工作原理生成對(duì)抗網(wǎng)絡(luò)的數(shù)學(xué)公式如下:其中,代表生成器,代表判別器,代表噪聲,代表的是熵(Entropy)。公式右側(cè)第一項(xiàng)表示:真實(shí)樣本經(jīng)過(guò)判別器D后得到的熵。右側(cè)第二項(xiàng)表示:噪聲空間中的生成器數(shù)據(jù)分布經(jīng)過(guò)判別器后得到的熵。左側(cè)的式子表示:判別器對(duì)真實(shí)和生成樣本學(xué)習(xí)。目標(biāo)是使真實(shí)樣本輸出概率接近1,生成樣本輸出概率接近0。生成器致力于生成接近真實(shí)的樣本,讓判別器誤以為是真實(shí)樣本。即生成器希望其生成的樣本能夠以高置信度被判別器接受為真實(shí)樣本。這種對(duì)抗性訓(xùn)練促使生成器不斷調(diào)整生成的樣本,以使其更逼真、更接近真實(shí)數(shù)據(jù)。生成器和判別器在網(wǎng)絡(luò)訓(xùn)練過(guò)程中彼此競(jìng)爭(zhēng)和相互促進(jìn)。2.2卷積神經(jīng)網(wǎng)絡(luò)原理卷積神經(jīng)網(wǎng)絡(luò)是一種深度學(xué)習(xí)模型,廣泛應(yīng)用于圖像識(shí)別、目標(biāo)檢測(cè)、圖像分割等領(lǐng)域,取得了巨大成功,已成為計(jì)算機(jī)視覺(jué)中的主流模型之一。模型的主要組成部分如下:卷積層:卷積核是層中主要的參數(shù),應(yīng)用在樣本的局部區(qū)域,計(jì)算區(qū)域與卷積核的點(diǎn)積,結(jié)果存儲(chǔ)到特征圖對(duì)應(yīng)位置。小卷積核能捕獲更多細(xì)節(jié)特征,大卷積核則能涵蓋更廣范圍的特征。卷積操作具有參數(shù)共享和稀疏交互特性,可顯著減少參數(shù)量和計(jì)算負(fù)載。池化層:該層可以分成最大池化、均勻池化和最小池化層。最大池化層:矩陣范圍內(nèi)選擇最大元素進(jìn)行保留。平均池化層:矩陣范圍內(nèi)的數(shù)求平均值進(jìn)行保留。最小池化層:從輸入的矩陣中的某一范圍內(nèi)選擇最小的元素進(jìn)行保留。該層能夠大大降低特征的維度,減少計(jì)算量同時(shí)可以避免過(guò)擬合的問(wèn)題。激活層:該層引入非線性變換,能增進(jìn)模型的非線性擬合和表達(dá)能力。神經(jīng)網(wǎng)絡(luò)能學(xué)習(xí)和捕獲數(shù)據(jù)中復(fù)雜的特征。全連接層:經(jīng)過(guò)前面的操作后,該層把提取的特征扁平化為一維向量。在該層中,每個(gè)神經(jīng)元都與前一層的每個(gè)神經(jīng)元連接,因此它將前一層的所有特征作為輸入,使得能夠捕獲到輸入數(shù)據(jù)中的更復(fù)雜的模式和關(guān)聯(lián)能夠?qū)⑻崛〉降母呔S特征映射到輸出空間上,并通過(guò)梯度下降算法進(jìn)行參數(shù)優(yōu)化,以使模型能夠?qū)W習(xí)到輸入數(shù)據(jù)的復(fù)雜特征和規(guī)律。輸出層:根據(jù)任務(wù)需求輸出相應(yīng)的結(jié)果。2.3激活函數(shù)原理引入了非線性變換,用來(lái)增進(jìn)模型的非線性擬合和表達(dá)能力。神經(jīng)網(wǎng)絡(luò)可以學(xué)習(xí)和捕獲數(shù)據(jù)中復(fù)雜的特征。具體工作原理如下:引入非線性:沒(méi)有使用激活函數(shù),整個(gè)網(wǎng)絡(luò)用線性變換表示,限制了網(wǎng)絡(luò)的表達(dá)能力。引入非線性使得神經(jīng)網(wǎng)絡(luò)能夠?qū)W習(xí)到非線性模式和復(fù)雜關(guān)系,進(jìn)而更好地?cái)M合復(fù)雜的數(shù)據(jù)分布。提升神經(jīng)網(wǎng)絡(luò)的表達(dá)能力和穩(wěn)定性:通過(guò)堆疊多個(gè)激活函數(shù)逼近各種復(fù)雜函數(shù),增強(qiáng)非線性特性,提升網(wǎng)絡(luò)穩(wěn)定性和收斂速度,實(shí)現(xiàn)對(duì)復(fù)雜問(wèn)題的建模。在實(shí)際應(yīng)用中,應(yīng)根據(jù)問(wèn)題和網(wǎng)絡(luò)結(jié)構(gòu)選擇適當(dāng)?shù)募せ詈瘮?shù)。2.4損失函數(shù)原理其是深度學(xué)習(xí)模型中重要的組成部分,用于衡量模型的預(yù)測(cè)值和真實(shí)值之間的差異。其提供了一個(gè)反饋信號(hào),指示模型在哪個(gè)方向上需要調(diào)整參數(shù),從而改善預(yù)測(cè)性能。在訓(xùn)練過(guò)程中,每個(gè)樣本的損失函數(shù)值都會(huì)被計(jì)算,并且在整個(gè)訓(xùn)練集上進(jìn)行平均或加權(quán)平均。采用二分類交叉熵?fù)p失函數(shù)BCELoss(BinaryCrossEntropyLoss)的作為本系統(tǒng)的損失函數(shù)。BCELoss的計(jì)算公式如下:其中:是模型的預(yù)測(cè)概率,表示樣本屬于正類別的概率。是真實(shí)標(biāo)簽,表示樣本的真實(shí)類別。BCELoss度量預(yù)測(cè)概率與真實(shí)標(biāo)簽的差距。一致時(shí)值小,表示準(zhǔn)確;不一致時(shí)值大,表示不準(zhǔn)確。2.5優(yōu)化器原理優(yōu)化器首先計(jì)算參數(shù)的梯度,通常通過(guò)反向傳播算法實(shí)現(xiàn),然后利用這些梯度信息來(lái)更新參數(shù),以減小損失函數(shù)的值。常見(jiàn)的參數(shù)更新規(guī)則是:新參數(shù)值=原參數(shù)值-學(xué)習(xí)率×梯度。本系統(tǒng)采用的優(yōu)化器是Adam(AdaptiveMomentEstimation)是一種流行的自適應(yīng)學(xué)習(xí)率算法,結(jié)合了動(dòng)量加速梯度下降。動(dòng)量項(xiàng)積累了過(guò)去梯度的加權(quán)平均,使得梯度更新具有慣性,能更快地在參數(shù)空間中前進(jìn)。動(dòng)量項(xiàng)有助于減少參數(shù)更新的方差,尤其是在具有高曲率的方向上,可以更快地收斂到局部最優(yōu)解。Adam還維護(hù)每個(gè)參數(shù)的自適應(yīng)學(xué)習(xí)率,利用梯度的平方指數(shù)加權(quán)平均估計(jì)參數(shù)的二階矩,動(dòng)態(tài)調(diào)整參數(shù)的學(xué)習(xí)率。自適應(yīng)學(xué)習(xí)率使得參數(shù)更新更加一致,避免手動(dòng)調(diào)整學(xué)習(xí)率。Adam有兩個(gè)主要的超參數(shù):學(xué)習(xí)率和指數(shù)衰減率。學(xué)習(xí)率控制每次參數(shù)更新步長(zhǎng)的大小,而指數(shù)衰減率控制了動(dòng)量項(xiàng)和自適應(yīng)學(xué)習(xí)率的參數(shù)的指數(shù)加權(quán)平均的速度。通常情況下,Adam使用默認(rèn)的超參數(shù)值,但在某些情況下可能需要調(diào)整以獲得更好的性能。2.6本系統(tǒng)生成對(duì)抗網(wǎng)絡(luò)(GAN)模型的選用本系統(tǒng)使用的模型是GAN與CNN結(jié)合的DCGAN模型,網(wǎng)絡(luò)架構(gòu)如下文所述。生成器的架構(gòu),如下:輸入數(shù)據(jù):隨機(jī)產(chǎn)生一個(gè)噪聲向量,維度是噪聲維度。這個(gè)噪聲向量可以被視為一個(gè)1×1×噪聲維度的特征圖。網(wǎng)絡(luò)結(jié)構(gòu):其共有5層網(wǎng)絡(luò)。每層的第一層是轉(zhuǎn)置卷積層,將輸入的隨機(jī)噪聲向量轉(zhuǎn)換成特征圖。隨后都包括了批歸一化層和ReLU激活函數(shù)。轉(zhuǎn)置卷積層通過(guò)反向卷積操作將特征圖尺寸逐步放大,通道數(shù)逐步減小。在每個(gè)轉(zhuǎn)置卷積層后面都接了批歸一化層,加速模型收斂并提高穩(wěn)定性。ReLU激活函數(shù)引入非線性,增強(qiáng)網(wǎng)絡(luò)表達(dá)能力。輸出數(shù)據(jù):生成器的最后一層是轉(zhuǎn)置卷積層,將特征圖映射為圖像。輸出通道數(shù)為3,代表RGB三個(gè)顏色通道。輸出圖像的像素范圍在[-1,1],因此最后一層使用了Tanh激活函數(shù)把像素值進(jìn)行縮放。輸入尺寸為1×1,通過(guò)一系列轉(zhuǎn)置卷積層逐步放大,最終輸出圖像的尺寸為96×96。判別器的架構(gòu),如下:輸入數(shù)據(jù):判別器被輸入生成的樣本或真實(shí)樣本。網(wǎng)絡(luò)結(jié)構(gòu):其共有5層網(wǎng)絡(luò)。每層的第一層是卷積層和LeakyReLU激活函數(shù),用于引入非線性。隨后的每層都包括了卷積層、批歸一化層和LeakyReLU激活函數(shù)。判別器通過(guò)一系列卷積層將輸入樣本壓縮和細(xì)化,最終輸出一個(gè)數(shù)值表示輸入樣本是真實(shí)樣本的概率。輸出數(shù)據(jù):輸出層是卷積層和Sigmoid激活函數(shù),將數(shù)值映射到[0,1],表示輸入樣本是真實(shí)樣本的概率。2.7本系統(tǒng)深度學(xué)習(xí)框架的選用隨著深度學(xué)習(xí)的不斷發(fā)展,越來(lái)越多的人工智能應(yīng)用進(jìn)入人們的視線當(dāng)中,如人臉檢測(cè)、自動(dòng)駕駛、AI換臉等。這些應(yīng)用誕生的背后是各種各樣的深度學(xué)習(xí)框架,它們幫助算法工程師更加快速、準(zhǔn)確地建構(gòu)深度學(xué)習(xí)模型(唐曉彬,2023),選擇PyTorch作為本系統(tǒng)搭建生成對(duì)抗網(wǎng)絡(luò)的深度學(xué)習(xí)框架的原因如下:易用:框架由Facebook研究團(tuán)隊(duì)開發(fā)和維護(hù),提供了豐富功能和靈活接口,使得深度學(xué)習(xí)任務(wù)變得簡(jiǎn)單。其設(shè)計(jì)最易用,用戶學(xué)習(xí)成本較低,很便于調(diào)試代碼,讓用戶可以專注于實(shí)現(xiàn)自己的想法,無(wú)需擔(dān)心框架的限制。簡(jiǎn)潔:設(shè)計(jì)分為三個(gè)抽象層次:Tensor表示高維數(shù)組,autograd表示自動(dòng)求導(dǎo),nn.Module表示神經(jīng)網(wǎng)絡(luò)。這樣設(shè)計(jì)的好處是更少的抽象和更直觀,使得源代碼易讀易懂。高效:提供動(dòng)態(tài)圖計(jì)算的功能,可以在運(yùn)行時(shí)即時(shí)構(gòu)建計(jì)算圖,這樣的特性使得模型的定義和調(diào)試更加靈活。同時(shí)也支持靜態(tài)圖計(jì)算,通過(guò)TorchScript將動(dòng)態(tài)圖轉(zhuǎn)換為靜態(tài)圖,可以提升模型的性能和部署效率。開發(fā)者可以使用CUDA加速計(jì)算,以提高深度學(xué)習(xí)模型的訓(xùn)練速度。利用GPU進(jìn)行充分的加速計(jì)算,提升了高效的并行計(jì)算能力。PyTorch的動(dòng)態(tài)圖計(jì)算和自動(dòng)求導(dǎo)機(jī)制使得數(shù)據(jù)在GPU上進(jìn)行并行計(jì)算變得非常簡(jiǎn)單和高效。生態(tài)和拓展:擁有豐富的開源模型和擴(kuò)展庫(kù),研究者可以輕松地找到相關(guān)的源碼進(jìn)行學(xué)習(xí),幫助開發(fā)者快速構(gòu)建和訓(xùn)練深度學(xué)習(xí)模型。該框架還擁有優(yōu)秀的社區(qū)服務(wù),研究者之間可以隨時(shí)且方便地進(jìn)行交流和分享經(jīng)驗(yàn)。2.8本系統(tǒng)Web開發(fā)框架的選用Web開發(fā)指的是實(shí)現(xiàn)基于互聯(lián)網(wǎng)的應(yīng)用程序開發(fā),以滿足用戶的各種需求并向用戶提供各種系統(tǒng)相關(guān)的功能。當(dāng)前主流的Web開發(fā)框架通常會(huì)根據(jù)不同的編程語(yǔ)言和應(yīng)用場(chǎng)景而有所不同。本文選用Flaskweb開發(fā)框架,F(xiàn)lask框架非常簡(jiǎn)單易用,它不強(qiáng)制開發(fā)者使用特定的項(xiàng)目結(jié)構(gòu)或是依賴關(guān)系,而是提供了一種自由靈活的開發(fā)方式(田勝男,2023)。Flask的核心是其簡(jiǎn)潔但是非常強(qiáng)大的Web服務(wù)網(wǎng)關(guān)結(jié)構(gòu)WSGI(WebServerGatewayInterface),開發(fā)者可以僅用幾行代碼就創(chuàng)建一個(gè)簡(jiǎn)單的Web應(yīng)用。Flask利用裝飾器來(lái)定義URL路由和視圖函數(shù),簡(jiǎn)化了路由的編寫和管理,把URL與特定的視圖函數(shù)關(guān)聯(lián)到一起開發(fā)者使用‘@app.route()’裝飾器能夠?qū)崿F(xiàn)這樣的功能,實(shí)現(xiàn)用戶訪問(wèn)URL時(shí)調(diào)用對(duì)應(yīng)的視圖函數(shù)進(jìn)行處理。Flask使用Jinja2模板引擎來(lái)生成動(dòng)態(tài)HTML內(nèi)容,使得在Web應(yīng)用中嵌入Python代碼變得非常方便。Jinja2模板語(yǔ)言簡(jiǎn)單易懂,支持變量替換、控制結(jié)構(gòu)(如循環(huán)、條件)和模板繼承等功能,使得實(shí)現(xiàn)復(fù)雜的頁(yè)面也變得很簡(jiǎn)單。Flask使用‘Werkzeug’作為底層的WSGI工具庫(kù),向開發(fā)者提供了HTTP請(qǐng)求和響應(yīng)對(duì)象、URL路由、中間件等功能。綜上所述,F(xiàn)lask是一個(gè)簡(jiǎn)潔、靈活且易于學(xué)習(xí)的Web開發(fā)框架,開發(fā)者能夠通過(guò)其簡(jiǎn)潔的設(shè)計(jì)和豐富的擴(kuò)展插件快速構(gòu)建出高質(zhì)量的Web應(yīng)用程序,其適用于各種規(guī)模的項(xiàng)目和應(yīng)用場(chǎng)景。需求分析與系統(tǒng)設(shè)計(jì)本章綜述本系統(tǒng)的功能需求分析、功能實(shí)現(xiàn)方案和系統(tǒng)使用的流程。3.1功能需求分析本系統(tǒng)提供兩項(xiàng)主要功能:一是基于已訓(xùn)練好的生成對(duì)抗網(wǎng)絡(luò)的圖片生成器,用戶在前端頁(yè)面輸入生成圖片的相關(guān)參數(shù)傳遞給后臺(tái)應(yīng)用調(diào)用圖片方法,系統(tǒng)將生成好的圖片展示到前端頁(yè)面供用戶查看;二是用戶上傳訓(xùn)練集,調(diào)用后臺(tái)的模型訓(xùn)練框架進(jìn)行圖片生成模型的訓(xùn)練。本系統(tǒng)旨在為廣大生成對(duì)抗網(wǎng)絡(luò)初學(xué)者和對(duì)計(jì)算機(jī)生成圖片感興趣的用戶提供開放式的使用體驗(yàn)。用戶可以通過(guò)訪問(wèn)前端頁(yè)面,無(wú)需登錄,即可使用系統(tǒng)。此系統(tǒng)省去了繁瑣的訓(xùn)練環(huán)境配置、硬件選擇、數(shù)據(jù)預(yù)處理、模型選用、模型訓(xùn)練、參數(shù)優(yōu)化、保存模型等步驟,使用戶能夠輕松地實(shí)現(xiàn)圖片生成的應(yīng)用。本系統(tǒng)向用戶提供的主要功能如下:圖片生成器:本系統(tǒng)向用戶提供已經(jīng)訓(xùn)練好的圖片生成模型。用戶在前端頁(yè)面選擇所需的圖片生成器,并輸入相關(guān)參數(shù)以指導(dǎo)選用的模型生成圖片。后臺(tái)會(huì)調(diào)用模型生成圖片的方法,并將生成的圖片通過(guò)彈窗的方式展示到前端頁(yè)面供用戶查看。數(shù)據(jù)集管理:本系統(tǒng)向用戶提供展示已有數(shù)據(jù)集列表和上傳新數(shù)據(jù)集的功能。用戶在前端頁(yè)面選擇數(shù)據(jù)集管理的功能,用戶可以上傳新的數(shù)據(jù)集到系統(tǒng)中,并可以查看所有數(shù)據(jù)集的名稱以及每個(gè)數(shù)據(jù)集對(duì)應(yīng)的圖片數(shù)量。模型庫(kù)查閱:本系統(tǒng)向用戶提供查閱已訓(xùn)練好的圖片生成模型的功能。用戶在前端頁(yè)面選擇模型庫(kù)查閱功能,系統(tǒng)調(diào)用文件路徑的查詢方法,把相關(guān)文件展示到前端頁(yè)面,用戶可以查閱到已經(jīng)訓(xùn)練好的圖片生成模型。模型訓(xùn)練:本系統(tǒng)向用戶提供生成對(duì)抗網(wǎng)絡(luò)的模型訓(xùn)練功能。用戶在前端頁(yè)面選擇模型訓(xùn)練,用戶可以調(diào)用本系統(tǒng)的生成對(duì)抗網(wǎng)絡(luò)訓(xùn)練框架訓(xùn)練新的圖片生成模型,訓(xùn)練得到的新圖片生成模型可以用于后續(xù)的相關(guān)應(yīng)用。3.2功能實(shí)現(xiàn)方案本系統(tǒng)的功能實(shí)現(xiàn)方案基于FlaskWeb開發(fā)框架和PyTorch深度學(xué)習(xí)開發(fā)框架。3.2.1Pytorch深度學(xué)習(xí)框架設(shè)計(jì)生成對(duì)抗網(wǎng)絡(luò)神經(jīng)網(wǎng)絡(luò)的通用訓(xùn)練步驟如下:定義網(wǎng)絡(luò)結(jié)構(gòu)、加載數(shù)據(jù)集、進(jìn)行前向傳播計(jì)算損失(即網(wǎng)絡(luò)預(yù)測(cè)結(jié)果與正確結(jié)果之間的差距)、反向傳播更新參數(shù)、保存和應(yīng)用模型。本系統(tǒng)設(shè)計(jì)的生成對(duì)抗網(wǎng)絡(luò)的訓(xùn)練流程,如圖3.1所示:圖3.1生成對(duì)抗網(wǎng)絡(luò)訓(xùn)練流程圖本系統(tǒng)在訓(xùn)練生成器模型時(shí)使用的隨機(jī)噪聲是隨機(jī)生成的高斯噪聲。高斯噪聲是常見(jiàn)的隨機(jī)信號(hào),特點(diǎn)是服從正態(tài)分布的隨機(jī)變量序列,這種正態(tài)分布的特性使得高斯噪聲在數(shù)學(xué)和統(tǒng)計(jì)分析中都具有很好的性質(zhì),便于開發(fā)者進(jìn)行建模和分析。高斯噪聲的數(shù)據(jù)樣本之間通常是相互獨(dú)立的,數(shù)據(jù)樣本根據(jù)相同的概率分布獨(dú)立生成。在深度學(xué)習(xí)中,高斯噪聲常被用作一種正則化手段,幫助模型更好地泛化和抵抗過(guò)擬合。本系統(tǒng)中的生成器模型和判別器模型是使用‘torch.nn’模塊構(gòu)建的。訓(xùn)練方法包括以下步驟:首先計(jì)算損失函數(shù)的值,接著根據(jù)得到的值計(jì)算模型參數(shù)的梯度,最后根據(jù)梯度更新優(yōu)化器的參數(shù)。本系統(tǒng)的損失函數(shù)是通過(guò)‘torch.nn.loss’模塊實(shí)現(xiàn)的。選用的損失函數(shù)是二分類交叉熵?fù)p失函數(shù)(BCELoss,BinaryCrossEntropyLoss)用于處理二分類問(wèn)題,其中樣本屬于兩個(gè)類別其中之一,模型輸出該樣本類別概率值。該損失函數(shù)在概率接近0或1時(shí)仍有較小的梯度,幫助開發(fā)者可以減輕生成對(duì)抗網(wǎng)絡(luò)模型在訓(xùn)練過(guò)程中的梯度消失問(wèn)題。本系統(tǒng)使用‘torch.optim’模塊實(shí)現(xiàn)優(yōu)化器功能。在本系統(tǒng)中,采用Adam優(yōu)化器。該優(yōu)化器能根據(jù)參數(shù)的梯度大小自適應(yīng)調(diào)整學(xué)習(xí)率,以加快模型的收斂速度。3.2.2Flaskweb開發(fā)框架設(shè)計(jì)前端頁(yè)面在Flaskweb開發(fā)框架中:Urls模塊用于定義系統(tǒng)頁(yè)面的定向,用戶訪問(wèn)本系統(tǒng)時(shí)會(huì)顯示已設(shè)計(jì)好的前端頁(yè)面。Views模塊則負(fù)責(zé)構(gòu)建Python代碼,當(dāng)用戶訪問(wèn)系統(tǒng)時(shí),會(huì)收到對(duì)應(yīng)的HTTP響應(yīng),并將其反饋到用戶訪問(wèn)的前端頁(yè)面上。Model模塊內(nèi)定義了系統(tǒng)靜態(tài)文件和相關(guān)文件的路徑,使用戶可以使用系統(tǒng)中的相關(guān)查閱功能查看已保存的數(shù)據(jù)集文件、已訓(xùn)練好的模型文件和用戶自發(fā)上傳新的數(shù)據(jù)集文件。Template模塊內(nèi)定義了系統(tǒng)的HTML文件,用戶可以通過(guò)訪問(wèn)不同功能的前端頁(yè)面來(lái)進(jìn)行交互。Flask框架設(shè)計(jì)網(wǎng)頁(yè)的架構(gòu)如下圖3.2所示:圖3.2Flask框架設(shè)計(jì)前端頁(yè)面結(jié)構(gòu)圖3.3系統(tǒng)使用的流程本系統(tǒng)包含5個(gè)前端頁(yè)面,用戶可以通過(guò)訪問(wèn)這些頁(yè)面來(lái)調(diào)用系統(tǒng)的功能。詳細(xì)的系統(tǒng)使用流程圖,如圖3.3所示:圖3.3本系統(tǒng)使用流程圖用戶通過(guò)訪問(wèn)本系統(tǒng)的首頁(yè),可以查閱到本系統(tǒng)的相關(guān)功能介紹,通過(guò)導(dǎo)航欄切換到相對(duì)應(yīng)的功能頁(yè)面,系統(tǒng)調(diào)用不同的后臺(tái)方法向用戶提供所選擇的功能,并且用戶選擇的功能會(huì)在導(dǎo)航欄高亮顯示,方便用戶進(jìn)行識(shí)別。用戶通過(guò)訪問(wèn)本系統(tǒng)的圖片生成器頁(yè)面,用戶選擇的功能會(huì)在導(dǎo)航欄高亮顯示,方便用戶進(jìn)行識(shí)別。用戶可以在該前端頁(yè)面輸入相關(guān)圖片生成的參數(shù)傳遞給已訓(xùn)練好的圖片生成模型,調(diào)用后臺(tái)的圖片生成方法生成圖片,并通過(guò)彈窗的方式展示生成的新圖片到前端頁(yè)面給用戶查看。用戶通過(guò)訪問(wèn)本系統(tǒng)的數(shù)據(jù)集管理頁(yè)面,用戶選擇的功能會(huì)在導(dǎo)航欄高亮顯示,方便用戶進(jìn)行識(shí)別。用戶可以在該前端頁(yè)面查閱到本系統(tǒng)已經(jīng)保存好的數(shù)據(jù)集名稱、數(shù)據(jù)集中的文件數(shù)量和用戶可以自發(fā)上傳數(shù)據(jù)集以供系統(tǒng)后續(xù)的相關(guān)使用。用戶通過(guò)訪問(wèn)本系統(tǒng)的模型庫(kù)查閱頁(yè)面,用戶選擇的功能會(huì)在導(dǎo)航欄高亮顯示,方便用戶進(jìn)行識(shí)別。用戶可以在該前端頁(yè)面查詢已經(jīng)訓(xùn)練好的模型文件以便系統(tǒng)后續(xù)的相關(guān)使用。用戶通過(guò)訪問(wèn)本系統(tǒng)的模型訓(xùn)練頁(yè)面,用戶選擇的功能會(huì)在導(dǎo)航欄高亮顯示,方便用戶進(jìn)行識(shí)別。用戶可以在該前端頁(yè)面調(diào)用后臺(tái)已構(gòu)建好的模型訓(xùn)練方法用來(lái)訓(xùn)練用戶期望的圖片生成模型以便系統(tǒng)后續(xù)的相關(guān)使用,模型訓(xùn)練功能在后臺(tái)執(zhí)行不影響本系統(tǒng)其他功能的使用。圖片生成器的設(shè)計(jì)與實(shí)現(xiàn)本章綜述本系統(tǒng)所使用的卷積生成對(duì)抗網(wǎng)絡(luò)(DCGAN)的詳細(xì)架構(gòu),包括數(shù)據(jù)載入與數(shù)據(jù)預(yù)處理、生成器架構(gòu)代碼實(shí)現(xiàn)、判別器架構(gòu)代碼實(shí)現(xiàn)、模型訓(xùn)練代碼實(shí)現(xiàn)、模型生成圖片代碼實(shí)現(xiàn)并且對(duì)比傳統(tǒng)生成對(duì)抗網(wǎng)絡(luò)(GAN)架構(gòu)的性能差異。4.1數(shù)據(jù)載入與數(shù)據(jù)預(yù)處理本系統(tǒng)處理數(shù)據(jù)集的代碼如下所示:將數(shù)據(jù)集中的非圖片數(shù)據(jù)刪除:#讀取所有的文件forfileinos.listdir("data/faces"):filename="data/faces/%s"%filetry:Image.open(filename)except:os.remove(filename)print("%s錯(cuò)誤"%filename)數(shù)據(jù)預(yù)處理并加載數(shù)據(jù)集到網(wǎng)絡(luò)中:#構(gòu)建一個(gè)圖形變換庫(kù),這里是對(duì)圖片進(jìn)行處理transforms=tv.transforms.Compose([tv.transforms.Resize(opt.image_size),tv.transforms.CenterCrop(opt.image_size),tv.transforms.ToTensor(),tv.transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])#這里傳入了前面的圖片路徑和變換庫(kù),經(jīng)過(guò)這一步操作獲取到了數(shù)據(jù)集dataset=tv.datasets.ImageFolder(opt.data_path,transform=transforms)#調(diào)用數(shù)據(jù)加載器,加載數(shù)據(jù)集dataloader=DataLoader(dataset,batch_size=opt.batch_size,shuffle=True,num_workers=opt.num_workers,drop_last=True)‘transforms’是一個(gè)‘torchvision.transforms.Compose’對(duì)象,用于定義圖片的預(yù)處理操作序列。通過(guò)調(diào)用Resize方法將圖片大小調(diào)整為指定的大小,用CenterCrop方法將圖片進(jìn)行中心裁剪,保留圖片中心區(qū)域,用ToTensor方法將圖片數(shù)據(jù)轉(zhuǎn)換為Tensor格式,同時(shí)將像素值縮放到[0,1]范圍之間,用Normalize方法將圖片數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化。使用‘torchvision.datasets.ImageFolder’加載數(shù)據(jù)集,該數(shù)據(jù)集所有文件按文件夾保存,每個(gè)文件夾下存儲(chǔ)同一類別的圖片,文件夾的名字為分類的名字,同時(shí)傳入了預(yù)處理操作‘transforms’。使用‘DataLoader(dataset,batch_size,shuffle,num_workers,drop_last)’創(chuàng)建數(shù)據(jù)加載器,用于批量加載數(shù)據(jù)。在這段代碼中,'dataset'是之前創(chuàng)建的數(shù)據(jù)集,'batch_size'表示每個(gè)批次中樣本的數(shù)量,'shuffle'用于確定是否打亂數(shù)據(jù)順序,'num_workers'用于指定數(shù)據(jù)加載的線程數(shù)。參數(shù)'drop_last'表示是否丟棄最后一個(gè)不完整的批次。通過(guò)以上步驟,本系統(tǒng)實(shí)現(xiàn)了對(duì)圖片數(shù)據(jù)的預(yù)處理和數(shù)據(jù)加載,為后續(xù)的圖片處理任務(wù)提供了數(shù)據(jù)基礎(chǔ),方便用戶進(jìn)行后續(xù)系統(tǒng)的使用。4.2生成器架構(gòu)代碼實(shí)現(xiàn)本系統(tǒng)的生成器架構(gòu)代碼如下所示:classNetG(nn.Module):def__init__(self,ngf,nz):super(NetG,self).__init__()#這里定義神經(jīng)網(wǎng)絡(luò)模塊self.main=nn.Sequential(#輸入一個(gè)nz維度的噪聲是一個(gè)1*1*nz的featuremapnn.ConvTranspose2d(nz,ngf*8,4,1,0,bias=False),nn.BatchNorm2d(ngf*8),nn.ReLU(True),#上一步的輸出形狀:(ngf*8)x4x4nn.ConvTranspose2d(ngf*8,ngf*4,4,2,1,bias=False),nn.BatchNorm2d(ngf*4),nn.ReLU(True),#上一步的輸出形狀:(ngf*4)x8x8nn.ConvTranspose2d(ngf*4,ngf*2,4,2,1,bias=False),nn.BatchNorm2d(ngf*2),nn.ReLU(True),#上一步的輸出形狀:(ngf*2)x16x16nn.ConvTranspose2d(ngf*2,ngf,4,2,1,bias=False),nn.BatchNorm2d(ngf),nn.ReLU(True),nn.ConvTranspose2d(ngf,4,6,2,1,bias=False),nn.Tanh()#輸出形狀:3x96x96)defforward(self,input):returnself.main(input)‘self.main=nn.Sequential()’定義了生成器的主體結(jié)構(gòu),采用了序列容器‘nn.Sequential’,其中包含一系列的卷積層、批量歸一化層和激活函數(shù),這些層的組合構(gòu)成了整個(gè)生成器的前向傳播流程?!畁n.ConvTranspose2d(in_channels,out_channels,kernel_size,stride,padding,bias=False)’定義了轉(zhuǎn)置卷積層,用于將輸入特征圖進(jìn)行上采樣,這里連續(xù)使用了四個(gè)轉(zhuǎn)置卷積層,每一層都會(huì)將特征圖的尺寸進(jìn)行放大,并通過(guò)批量歸一化層和ReLU激活函數(shù)進(jìn)行處理?!畁n.BatchNorm2d(num_features)’定義了二維批量歸一化層,用于對(duì)輸入進(jìn)行標(biāo)準(zhǔn)化處理,加速網(wǎng)絡(luò)訓(xùn)練和提高模型的穩(wěn)定性?!畁n.ReLU(True)’定義了帶有參數(shù)True的ReLU激活函數(shù),表示對(duì)輸入進(jìn)行修改,即直接在原始張量上進(jìn)行操作?!畁n.Tanh()’定義了Tanh激活函數(shù),將生成器的輸出限制在[-1,1]的范圍內(nèi),符合圖片的像素值范圍。‘defforward(self,input)’定義了前向傳播方法,用于定義模型的計(jì)算流程?!畆eturnself.main(input)’將輸入input經(jīng)過(guò)生成器的主體結(jié)構(gòu)‘self.main’進(jìn)行前向傳播,并返回生成的圖像。這一段代碼實(shí)現(xiàn)了本系統(tǒng)的生成器架構(gòu),將其用于把隨機(jī)輸入的噪聲最終逐步轉(zhuǎn)換成逼真的圖片,其定義了一系列堆疊轉(zhuǎn)置卷積層和批量歸一化層,使生成器能夠逐漸將隨機(jī)輸入的噪聲轉(zhuǎn)換為與訓(xùn)練集數(shù)據(jù)特征分布相似的圖片,方便用戶進(jìn)行后續(xù)系統(tǒng)的使用。4.3判別器架構(gòu)代碼實(shí)現(xiàn)本系統(tǒng)的判別器架構(gòu)代碼如下所示:classNetD(nn.Module):def__init__(self,ndf):super(NetD,self).__init__()self.main=nn.Sequential(#輸入3x96x96nn.Conv2d(3,ndf,7,9,1,bias=False),nn.leakyrelu(0.6,inplace=True),nn.BatchNorm2d(ndf*2),nn.LeakyReLU(0.7,inplace=True),nn.Conv2d(ndf*3,ndf*2,5,9,1,bias=False),nn.BatchNorm2d(ndf*5),nn.LeakyReLU(0.1,inplace=True),#輸出ndf*4x8x8nn.Conv2d(ndf*3,ndf*9,6,4,1,bias=False),nn.BatchNorm2d(ndf*8),nn.LeakyReLU(0.2,inplace=True),#輸出ndf*8x4x4nn.Conv2d(ndf*8,1,4,1,0,bias=False),nn.Sigmoid())defforward(self,input):returnself.main(input).view(-1)‘self.main=nn.Sequential()’定義了判別器的主體結(jié)構(gòu),采用了序列化容器‘nn.Sequential’,其中包含一系列的卷積層、批量歸一化層和LeakyReLU激活函數(shù),這些層的組合構(gòu)成了整個(gè)判別器的前向傳播流程?!畁n.Conv2d(in_channels,out_channels,kernel_size,stride,padding,bias=False)’定義了卷積層,用于提取輸入圖像的特征,連續(xù)使用了四個(gè)卷積層,每一層都會(huì)將特征圖的尺寸進(jìn)行縮小,并通過(guò)批量歸一化層和LeakyReLU激活函數(shù)進(jìn)行處理。‘nn.BatchNorm2d(num_features)’定義了二維批量歸一化層,用于對(duì)輸入進(jìn)行標(biāo)準(zhǔn)化處理。‘nn.LeakyReLU(0.2,inplace=True)’定義了帶有參數(shù)0.2的LeakyReLU激活函數(shù),用于引入少量的負(fù)斜率,以防止梯度消失。‘nn.Sigmoid()’定義了Sigmoid激活函數(shù),用于將判別器的輸出壓縮到[0,1]的范圍之間,表示輸入圖片是真實(shí)的概率?!甦efforward(self,input)’定義了前向傳播方法,用于定義模型的計(jì)算流程?!畆eturnself.main(input).view(-1)’將輸入‘input’經(jīng)過(guò)判別器的主體結(jié)構(gòu)‘self.main’進(jìn)行前向傳播,并通過(guò)‘view(-1)’操作將輸出結(jié)果展平成一維張量,以便后續(xù)計(jì)算損失函數(shù)。這一段代碼實(shí)現(xiàn)了本系統(tǒng)的判別器網(wǎng)絡(luò)架構(gòu),將其用于判斷輸入到判別器中的圖片進(jìn)行真假的判斷,其定義了一系列堆疊的卷積層和批量歸一化層,用于提取輸入圖片的特征,最終通過(guò)‘Sigmoid’函數(shù)輸出圖片是真實(shí)的概率,方便用戶進(jìn)行后續(xù)系統(tǒng)的使用。4.4模型訓(xùn)練代碼實(shí)現(xiàn)本系統(tǒng)的模型訓(xùn)練代碼如下所示:#加載網(wǎng)絡(luò)#分別傳入一個(gè)featuremap和噪聲維度,判別器不需要傳入gnet,dnet=GNet(opt.ngf,opt.nz),DNet(opt.ndf)#在預(yù)訓(xùn)練模型上進(jìn)行迭代,默認(rèn)不進(jìn)行迭代,如果需要可以去掉下面的注釋#map_location=lambdastorage,loc:storage#dnet.load_state_dict(t.load(d_path,map_location=map_location))#gnet.load_state_dict(t.load(g_path,map_location=map_location))#把網(wǎng)絡(luò)移動(dòng)到CUDA設(shè)備上去dnet.to(device)gnet.to(device)#定義優(yōu)化器和損失函數(shù)#第一個(gè)參數(shù)是模型的所有參數(shù),然后第二個(gè)是學(xué)習(xí)率,第三個(gè)betas表示用于計(jì)算梯度的平均和平方的系數(shù)optimizer_g=t.optim.Adam(gnet.parameters(),opt.lr1,betas=(opt.beta1,0.999))optimizer_d=t.optim.Adam(dnet.parameters(),opt.lr2,betas=(opt.beta1,0.999))criterion=t.nn.BCELoss().to(device)#這里定義了真圖片和假圖片的標(biāo)簽,t.ones表示生成一個(gè)全為1的張量#真圖片label為1,假圖片label為0true_labels=t.ones(opt.batch_size).to(device)fake_labels=t.zeros(opt.batch_size).to(device)#生成隨機(jī)數(shù)張量,這里的噪聲維度為100維,然后每一維都是1*1大小的矩陣fix_noises=t.randn(opt.batch_size,opt.nz,1,1).to(device)noises=t.randn(opt.batch_size,opt.nz,1,1).to(device)#初始化統(tǒng)計(jì)量的均值errord_meter=AverageValueMeter()errorg_meter=AverageValueMeter()#下面開始進(jìn)行迭代epochs=range(opt.max_epoch)forepochiniter(epochs):#這里加載數(shù)據(jù)集,tqdm.tqdm在迭代時(shí)會(huì)顯示一個(gè)進(jìn)度條forii,(img,_)intqdm.tqdm(enumerate(dataloader)):#img表示圖片,ii表示當(dāng)前為第幾次batchreal_img=img.to(device)#這里訓(xùn)練判別器ifii%opt.d_every==0:#首先進(jìn)行梯度下降,把模型的梯度參數(shù)初始化為0optimizer_d.zero_grad()#首先把真的圖片的參數(shù)傳遞進(jìn)去,然后獲取損失值#盡可能的把真圖片判別為正確output=netd(real_img)error_d_real=criterion(output,true_labels)#進(jìn)行權(quán)重更新error_d_real.backward()#盡可能把假圖片判別為錯(cuò)誤#這里生成隨機(jī)噪聲noises.data.copy_(t.randn(opt.batch_size,opt.nz,1,1))#根據(jù)前面的噪聲,生成一張假圖片fake_img=netg(noises).detach()#這里使用判別器來(lái)判斷生成的假圖片output=netd(fake_img)error_d_fake=criterion(output,fake_labels)error_d_fake.backward()optimizer_d.step()#這里把損失值放入error_d=error_d_fake+error_d_realerrord_meter.add(error_d.item())#這里訓(xùn)練生成器ifjj%opt.g_every==0:#判斷optimizer_g.zero_grad()noises.data.copy_(t.randn(opt.batch_size,opt.nz,1,1))fake_img=gnet(noises)output=dnet(fake_img)error_g=criterion(output,true_labels)error_g.backward()optimizer_g.step()errorg_meter.add(error_g.item())這一段代碼實(shí)現(xiàn)了本系統(tǒng)中生成對(duì)抗網(wǎng)絡(luò)的訓(xùn)練過(guò)程:首先,創(chuàng)建了生成器'gnet'和判別器'dnet',并傳入了噪聲維度、生成器特征圖數(shù)量和判別器特征圖數(shù)量。然后,將網(wǎng)絡(luò)移動(dòng)到指定的CUDA設(shè)備上。使用Adam優(yōu)化器優(yōu)化生成器和判別器的參數(shù),使用二元交叉熵?fù)p失函數(shù)衡量生成器和判別器的性能。使用隨機(jī)數(shù)生成器‘t.ones’和‘t.zeros’函數(shù)創(chuàng)建真實(shí)圖片和虛假圖片的標(biāo)簽,分別設(shè)置為1和0。使用隨機(jī)數(shù)生成器‘t.randn’創(chuàng)建固定大小的噪聲張量用于生成虛假圖片。使用‘AverageValueMeter’類初始化用于統(tǒng)計(jì)損失值的均值。使用嵌套循環(huán)來(lái)迭代訓(xùn)練模型,外層循環(huán)遍歷每個(gè)epoch,內(nèi)層循環(huán)遍歷每個(gè)batch。判別器訓(xùn)練包括計(jì)算真假圖片損失值進(jìn)行優(yōu)化。生成器訓(xùn)練是將隨機(jī)噪聲輸出成圖片,計(jì)算判別器對(duì)生成圖片損失值,并進(jìn)行優(yōu)化。每次優(yōu)化后,使用'derror_meter'和'gerror_meter'記錄損失值,方便用戶進(jìn)行后續(xù)系統(tǒng)的使用。4.5模型生成圖片代碼實(shí)現(xiàn)本系統(tǒng)使用已有模型生成圖片代碼如下所示:defgenerate(gen_search_num:int=512,gen_num:int=64,gen_mean:int=0,gen_std:int=1,):device=t.device('cuda')#加載模型,netg,netd=NetG(ngf,nz).eval(),NetD(ndf).eval()map_location=lambdastorage,loc:storagenetd.load_state_dict(t.load(netd_path,map_location=map_location))netg.load_state_dict(t.load(netg_path,map_location=map_location))netd.to(device)netg.to(device)#設(shè)置噪聲信息,根據(jù)設(shè)置的總生成數(shù)來(lái)設(shè)置隨機(jī)值noises=t.randn(gen_search_num,nz,1,1).normal_(gen_mean,gen_std)noises=noises.to(device)#生成圖片,并計(jì)算圖片在判別器的分?jǐn)?shù)fake_img=netg(noises)scores=netd(fake_img).detach()#對(duì)圖片進(jìn)行排序,選擇較好圖片indexs=scores.topk(gen_num)[1]result=[]foriiinindexs:result.append(fake_img.data[ii])#保存圖片tv.utils.save_image(t.stack(result),gen_img,normalize=True,range=(-1,1))這一段代碼實(shí)現(xiàn)了本系統(tǒng)隨機(jī)生成圖片的功能,并根據(jù)生成的圖片在判別器中的得分選取較好的圖片進(jìn)行保存。函數(shù)‘generate()’的參數(shù)包括生成的圖片數(shù)量、最終選取的圖片數(shù)量、噪聲均值和噪聲方差。首先創(chuàng)建生成器和判別器,并加載預(yù)訓(xùn)練的模型參數(shù),然后將模型移動(dòng)到指定的CUDA設(shè)備上。接著使用‘t.randn()’函數(shù)生成隨機(jī)噪聲,噪聲的形狀為(總生成圖片數(shù),噪聲維度,1,1),并使用用戶給定的均值和方差進(jìn)行初始化。隨后,使用生成器對(duì)隨機(jī)噪聲進(jìn)行前向傳播生成虛假圖片,再利用判別器對(duì)生成的圖片進(jìn)行評(píng)分。通過(guò)‘detach()’方法分離梯度信息,以避免對(duì)生成器的反向傳播產(chǎn)生影響。最后,對(duì)生成的圖片在判別器中的得分進(jìn)行排序,并選取得分高的圖片進(jìn)行保存,方便用戶進(jìn)行后續(xù)系統(tǒng)的使用。4.6本系統(tǒng)選用DCGAN模型與傳統(tǒng)GAN模型的性能對(duì)比傳統(tǒng)的GAN模型主要由全連接層組成,而DCGAN模型引入了卷積神經(jīng)網(wǎng)絡(luò)作為生成器和判別器的主體結(jié)構(gòu),提高了圖像生成的質(zhì)量和穩(wěn)定性,使得模型能夠更好地捕捉圖片中的特征和層次結(jié)構(gòu),相比于傳統(tǒng)的GAN模型,DAGAN模型更容易訓(xùn)練和收斂,生成的圖片質(zhì)量更高,同時(shí)能夠生成更多樣的圖片。DCGAN模型中的生成器使用反卷積操作將隨機(jī)噪聲轉(zhuǎn)換為圖片而不是簡(jiǎn)單地使用全連接層。傳統(tǒng)GAN模型生成的圖片可能缺乏細(xì)節(jié)和結(jié)構(gòu),生成的圖片質(zhì)量較低,并且傳統(tǒng)GAN模型的訓(xùn)練過(guò)程訓(xùn)練不穩(wěn)定,容易出現(xiàn)模式崩潰等問(wèn)題。如下展示本系統(tǒng)選用的DCGAN模型和傳統(tǒng)GAN模型在相同的訓(xùn)練集上進(jìn)行了200次訓(xùn)練后生成的圖片質(zhì)量。具體展示每訓(xùn)練50次后生成的圖片,如圖4.1至圖4.5所示:圖4.1訓(xùn)練1次的生成圖片質(zhì)量(右為DCGAN)圖4.2訓(xùn)練50次的生成圖片質(zhì)量(右為DCGAN)圖4.3訓(xùn)練100次的生成圖片質(zhì)量(右為DCGAN)圖4.4訓(xùn)練150次的生成圖片質(zhì)量(右為DCGAN)圖4.5訓(xùn)練200次的生成圖片質(zhì)量(右為DCGAN)經(jīng)過(guò)一次訓(xùn)練后,傳統(tǒng)GAN模型生成的圖片仍然呈現(xiàn)的是噪點(diǎn),而DCGAN模型生成的圖片已經(jīng)具有一些人物面部的輪廓。經(jīng)過(guò)50次訓(xùn)練后,傳統(tǒng)GAN模型生成的圖片才開始顯示一些人物面部的輪廓,而DCGAN模型生成的圖片已經(jīng)展現(xiàn)出了人物細(xì)節(jié)的面部特征。經(jīng)過(guò)100次訓(xùn)練后,傳統(tǒng)GAN模型生成的圖片才逐漸呈現(xiàn)人物細(xì)節(jié)的面部特征,而DCGAN模型生成的圖片已經(jīng)逐漸接近真實(shí)的圖片。在隨后的訓(xùn)練中,可以明顯觀察到由DCGAN模型生成的圖片質(zhì)量明顯大幅度高于傳統(tǒng)GAN模型生成的圖片。在經(jīng)過(guò)相關(guān)的實(shí)驗(yàn)后,決定使用生成圖片質(zhì)量較高的DCGAN模型作為本系統(tǒng)的圖片生成模型,方便用戶進(jìn)行后續(xù)系統(tǒng)的使用?;贔lask框架的網(wǎng)站開發(fā)設(shè)計(jì)與效果展示本章綜述本系統(tǒng)使用的Flask框架的網(wǎng)頁(yè)界面設(shè)計(jì)、網(wǎng)頁(yè)功能結(jié)構(gòu)和系統(tǒng)功能實(shí)現(xiàn)。5.1網(wǎng)頁(yè)界面設(shè)計(jì)本系統(tǒng)的頁(yè)面設(shè)計(jì)包括一個(gè)位于頁(yè)面頂部的系統(tǒng)功能切換導(dǎo)航欄,用戶可以通過(guò)點(diǎn)擊導(dǎo)航欄上的不同功能的名稱快速切換到對(duì)應(yīng)的功能頁(yè)面。用戶當(dāng)前所使用的功能會(huì)在導(dǎo)航欄中高亮顯示,以方便用戶進(jìn)行辨識(shí)。頁(yè)面的下方則是具體的功能頁(yè)面,包括功能的具體內(nèi)容和操作選項(xiàng)。兩者使用不同的顏色以區(qū)分,方便用戶進(jìn)行識(shí)別。頁(yè)面模板的結(jié)構(gòu)示意如圖5.1所示:圖5.1首頁(yè)界面模版展示5.2系統(tǒng)功能結(jié)構(gòu)本系統(tǒng)在Flask框架下渲染網(wǎng)頁(yè)的結(jié)構(gòu)如圖5.2所示:圖5.2Flask框架渲染網(wǎng)頁(yè)的結(jié)構(gòu)圖在FlaskWeb開發(fā)框架下,templates目錄用于存放系統(tǒng)的靜態(tài)文件,包括了HTML文件和系統(tǒng)相關(guān)的模板文件。而主要的網(wǎng)頁(yè)功能實(shí)現(xiàn)結(jié)構(gòu)則體現(xiàn)在View.py和Urls.py文件之中。View.py文件主要負(fù)責(zé)構(gòu)建Python代碼,處理用戶請(qǐng)求并生成相應(yīng)的HTTP響應(yīng)。Urls.py文件則用于定義系統(tǒng)頁(yè)面的路由和URL映射規(guī)則,以確定用戶請(qǐng)求應(yīng)該由哪個(gè)視圖函數(shù)來(lái)處理,方便用戶進(jìn)行后續(xù)系統(tǒng)的使用。5.3系統(tǒng)功能實(shí)現(xiàn)本系統(tǒng)的Flask框架的網(wǎng)頁(yè)功能通過(guò)<script>標(biāo)簽嵌入JavaScript代碼和Views.py的試圖函數(shù)實(shí)現(xiàn)。5.3.1使用導(dǎo)航欄切換頁(yè)面代碼實(shí)現(xiàn)使用導(dǎo)航欄切換頁(yè)面功能的代碼如下所示:<ulclass="navnav-pills"><lirole="presentation"class="active"><ahref="#">首頁(yè)</a></li><lirole="presentation"><ahref="/content">圖片生成器</a></li><lirole="presentation"><ahref="/data">數(shù)據(jù)集管理</a></li><lirole="presentation"><ahref="/model">模型庫(kù)查詢</a></li><lirole="presentation"><ahref="/train">模型訓(xùn)練</a></li></ul>@app.route('/',methods=['GET'])defindex():returnrender_template('index.html',page_title="圖片生成網(wǎng)站")@app.route('/data',methods=['GET','POST'])returnrender_template('data.html',page_title="數(shù)據(jù)集管理",folder_info=subfolder_info)@app.route('/model',methods=['GET','POST'])defget_model():returnrender_template('model.html',page_title="模型庫(kù)查詢")@app.route('/train',methods=['GET','POST'])deftrain():returnrender_template('train.html',page_title="模型訓(xùn)練")@app.route('/content',methods=['GET','POST'])defcontent():returnrender_template('content.html',page_title="圖片生成器")這一段代碼實(shí)現(xiàn)了本系統(tǒng)的導(dǎo)航欄切換功能頁(yè)面功能?!?’路由對(duì)應(yīng)的視圖函數(shù)‘index()’返回渲染index.html模板,并傳遞頁(yè)面標(biāo)題參數(shù)"圖片生成網(wǎng)站"?!?data’路由對(duì)應(yīng)的視圖函數(shù)‘data()’處理‘GET’和‘POST’請(qǐng)求,并返回渲染data.html模板,傳遞頁(yè)面標(biāo)題參數(shù)"數(shù)據(jù)集管理"和文件夾信息參數(shù)‘subfolder_info’?!?model’路由對(duì)應(yīng)的視圖函數(shù)‘get_model()’返回渲染model.html模板,并傳遞頁(yè)面標(biāo)題參數(shù)"模型庫(kù)查詢"?!?train’路由對(duì)應(yīng)的視圖函數(shù)‘train()’回渲染train.html模板,并傳遞頁(yè)面標(biāo)題參數(shù)"模型訓(xùn)練"?!?content’路由對(duì)應(yīng)的視圖函數(shù)‘content()’返回渲染content.html模板,并傳遞頁(yè)面標(biāo)題參數(shù)"圖片生成器",方便用戶進(jìn)行后續(xù)系統(tǒng)的使用。5.3.2數(shù)據(jù)集查閱代碼實(shí)現(xiàn)數(shù)據(jù)集查閱功能的代碼如下所示:<fieldsetclass="layui-elem-field"><legend>生成結(jié)果</legend><divclass="layui-field-box"><imgid="gan_res"alt=""src=""></div></fieldset>defget_data():folder_path='D:/bishetest/bisheshiyong/bisheshiyong/data/'#文件夾路徑subfolder_info=[]for_,dirnames,_inos.walk(folder_path):#使用匿名變量_來(lái)表示不需要的返回值fordirnameindirnames:dirpath=os.path.join(folder_path,dirname)files_count=len(os.listdir(dirpath))subfolder_info.append({'folder_name':dirname,'files_count':files_count})break#只獲取頂層文件夾的數(shù)據(jù),避免遍歷子文件夾這一段代碼實(shí)現(xiàn)了本系統(tǒng)的數(shù)據(jù)集查閱功能。在函數(shù)內(nèi)部,首先定義了‘folder_path’變量,指定了數(shù)據(jù)文件夾的路徑。然后創(chuàng)建了一個(gè)空列表‘subfolder_info’,用于存儲(chǔ)文件夾信息。利用‘os.walk(folder_path)’函數(shù),可以遍歷文件夾并獲取其中的信息。在循環(huán)中,對(duì)每個(gè)子文件夾的信息進(jìn)行處理。通過(guò)內(nèi)層的for循環(huán)遍歷‘dirnames’列表,獲取每個(gè)子文件夾的名稱‘dirname’。使用‘os.path.join(folder_path,dirname)’構(gòu)建子文件夾的完整路徑‘dirpath’。使用‘os.listdir(dirpath)’獲取子文件夾下的文件列表,并使用‘len()’函數(shù)獲取文件數(shù)量,將子文件夾的名稱和文件數(shù)量構(gòu)建為字典,添加到‘subfolder_info’列表中。由于只需要獲取頂層文件夾的數(shù)據(jù),因此使用了break語(yǔ)句來(lái)跳出循環(huán),避免遍歷子文件夾,方便用戶進(jìn)行后續(xù)系統(tǒng)的使用。5.3.3圖片生成代碼實(shí)現(xiàn)圖片生成功能的代碼如下所示:#項(xiàng)目啟動(dòng)自動(dòng)加載模型device=t.device('cuda')#如果是使用CPU那么就把下面這個(gè)注釋掉#device=t.device('cpu')#加載我們的模型,netg,netd=NetG(ngf,nz).eval(),NetD(ndf).eval()map_location=lambdastorage,loc:storagenetd.load_state_dict(t.load(netd_path,map_location=map_location))netg.load_state_dict(t.load(netg_path,map_location=map_location))netd.to(device)netg.to(device)#設(shè)置噪聲信息,根據(jù)我們?cè)O(shè)置的總生成數(shù)來(lái)設(shè)置隨機(jī)值noises=t.randn(gen_search_num,nz,1,1).normal_(gen_mean,gen_std)noises=noises.to(device)#生成圖片,并計(jì)算圖片在判別器的分?jǐn)?shù)fake_img=netg(noises)scores=netd(fake_img).detach()#對(duì)我們的圖片進(jìn)行排序,選擇較好圖片indexs=scores.topk(gen_num)[1]result=[]foriiinindexs:result.append(

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論