|
|
||
|---|---|---|
| .. | ||
| GANPyTorch.ipynb | ||
| GANTF.ipynb | ||
| README.md | ||
| StyleTransfer.ipynb | ||
| StyleTransfer_Keras.ipynb | ||
README.md
Generatyviniai priešiški tinklai
Ankstesniame skyriuje sužinojome apie generatyvinius modelius: modelius, kurie gali generuoti naujus vaizdus, panašius į tuos, kurie yra mokymo duomenų rinkinyje. VAE buvo geras generatyvinio modelio pavyzdys.
Klausimai prieš paskaitą
Tačiau, jei bandysime generuoti kažką tikrai prasmingo, pavyzdžiui, paveikslą su tinkama raiška, naudojant VAE, pastebėsime, kad mokymas nesikonverguoja gerai. Šiam tikslui turėtume išmokti apie kitą architektūrą, specialiai skirtą generatyviniams modeliams - Generatyviniai priešiški tinklai, arba GAN.
Pagrindinė GAN idėja yra turėti du neuroninius tinklus, kurie bus mokomi vienas prieš kitą:
Vaizdas sukurtas Dmitry Soshnikov
✅ Šiek tiek terminologijos:
- Generatorius – tinklas, kuris paima atsitiktinį vektorių ir sukuria vaizdą kaip rezultatą.
- Diskriminatorius – tinklas, kuris paima vaizdą ir turi nustatyti, ar tai tikras vaizdas (iš mokymo duomenų rinkinio), ar jis buvo sukurtas generatoriaus. Iš esmės tai yra vaizdų klasifikatorius.
Diskriminatorius
Diskriminatoriaus architektūra nesiskiria nuo įprasto vaizdų klasifikavimo tinklo. Paprasčiausiu atveju tai gali būti visiškai sujungtas klasifikatorius, tačiau dažniausiai tai bus konvoliucinis tinklas.
✅ GAN, pagrįstas konvoliuciniais tinklais, vadinamas DCGAN
CNN diskriminatorius susideda iš šių sluoksnių: keli konvoliuciniai+apjungimo sluoksniai (su mažėjančiu erdviniu dydžiu) ir vienas ar daugiau visiškai sujungtų sluoksnių, kad būtų gautas "funkcijų vektorius", galutinis dvejetainis klasifikatorius.
✅ „Apjungimas“ šiame kontekste yra technika, kuri sumažina vaizdo dydį. „Apjungimo sluoksniai sumažina duomenų matmenis, sujungdami neuronų grupių iš vieno sluoksnio išvestis į vieną neuroną kitame sluoksnyje.“ - šaltinis
Generatorius
Generatorius yra šiek tiek sudėtingesnis. Galite jį laikyti apverstu diskriminatoriumi. Pradedant nuo latentinio vektoriaus (vietoj funkcijų vektoriaus), jis turi visiškai sujungtą sluoksnį, kuris konvertuoja jį į reikiamą dydį/formą, po to eina dekonvoliuciniai+didinimo sluoksniai. Tai panašu į dekoderio dalį autoenkoderio.
✅ Kadangi konvoliucinis sluoksnis įgyvendinamas kaip linijinis filtras, einantis per vaizdą, dekonvoliucija iš esmės yra panaši į konvoliuciją ir gali būti įgyvendinta naudojant tą pačią sluoksnio logiką.
Vaizdas sukurtas Dmitry Soshnikov
GAN mokymas
GAN vadinami priešiškais, nes generatorius ir diskriminatorius nuolat konkuruoja tarpusavyje. Šios konkurencijos metu abu tinklai tobulėja, todėl tinklas išmoksta generuoti vis geresnius vaizdus.
Mokymas vyksta dviem etapais:
- Diskriminatoriaus mokymas. Ši užduotis yra gana paprasta: mes generuojame vaizdų partiją su generatoriumi, pažymime juos 0, kas reiškia netikrus vaizdus, ir paimame vaizdų partiją iš įvesties duomenų rinkinio (su žyme 1, tikras vaizdas). Mes gauname tam tikrą diskriminatoriaus nuostolį ir atliekame atgalinį skaičiavimą.
- Generatoriaus mokymas. Tai šiek tiek sudėtingiau, nes mes tiesiogiai nežinome tikėtino generatoriaus išvesties. Mes paimame visą GAN tinklą, sudarytą iš generatoriaus, po kurio eina diskriminatorius, tiekiame jam atsitiktinius vektorius ir tikimės, kad rezultatas bus 1 (atitinkantis tikrus vaizdus). Tada užšaldome diskriminatoriaus parametrus (nenorime, kad jis būtų mokomas šiame žingsnyje) ir atliekame atgalinį skaičiavimą.
Šio proceso metu tiek generatoriaus, tiek diskriminatoriaus nuostoliai reikšmingai nemažėja. Idealiu atveju jie turėtų svyruoti, atspindėdami abiejų tinklų našumo gerėjimą.
✍️ Pratimai: GAN
Problemos su GAN mokymu
GAN yra žinomi kaip ypač sunkiai mokomi. Štai kelios problemos:
- Režimo susiliejimas. Šiuo terminu apibūdinama situacija, kai generatorius išmoksta generuoti vieną sėkmingą vaizdą, kuris apgauna diskriminatorių, o ne įvairius skirtingus vaizdus.
- Jautrumas hiperparametrams. Dažnai galima pastebėti, kad GAN visai nesikonverguoja, o tada staiga sumažėja mokymosi greitis, dėl ko įvyksta konvergencija.
- Balanso palaikymas tarp generatoriaus ir diskriminatoriaus. Daugeliu atvejų diskriminatoriaus nuostolis gali greitai nukristi iki nulio, dėl ko generatorius nebegali toliau mokytis. Norint tai įveikti, galima pabandyti nustatyti skirtingus mokymosi greičius generatoriui ir diskriminatoriui arba praleisti diskriminatoriaus mokymą, jei nuostolis jau yra per mažas.
- Mokymas aukštos raiškos vaizdams. Atsispindint ta pačia problema kaip ir su autoenkoderiais, ši problema kyla dėl per didelio konvoliucinio tinklo sluoksnių rekonstrukcijos, dėl ko atsiranda artefaktai. Ši problema paprastai sprendžiama vadinamuoju progresyviu augimu, kai pirmiausia keli sluoksniai mokomi su mažos raiškos vaizdais, o tada sluoksniai „atrakinami“ arba pridedami. Kitas sprendimas būtų pridėti papildomas jungtis tarp sluoksnių ir mokyti kelias raiškas vienu metu - daugiau informacijos rasite šiame Multi-Scale Gradient GANs straipsnyje.
Stiliaus perkėlimas
GAN yra puikus būdas generuoti meninius vaizdus. Kita įdomi technika yra vadinamasis stiliaus perkėlimas, kuris paima vieną turinio vaizdą ir perpiešia jį kitu stiliumi, pritaikydamas filtrus iš stiliaus vaizdo.
Kaip tai veikia:
- Pradedame nuo atsitiktinio triukšmo vaizdo (arba nuo turinio vaizdo, tačiau supratimui lengviau pradėti nuo atsitiktinio triukšmo).
- Mūsų tikslas būtų sukurti tokį vaizdą, kuris būtų artimas tiek turinio vaizdui, tiek stiliaus vaizdui. Tai būtų nustatoma pagal dvi nuostolių funkcijas:
- Turinio nuostolis apskaičiuojamas remiantis funkcijomis, išgautomis CNN tam tikruose sluoksniuose iš dabartinio vaizdo ir turinio vaizdo.
- Stiliaus nuostolis apskaičiuojamas tarp dabartinio vaizdo ir stiliaus vaizdo sumaniai naudojant Gramo matricas (daugiau informacijos rasite pavyzdinėje užrašų knygelėje).
- Kad vaizdas būtų lygesnis ir pašalintų triukšmą, taip pat įvedame variacijos nuostolį, kuris apskaičiuoja vidutinį atstumą tarp kaimyninių pikselių.
- Pagrindinis optimizavimo ciklas koreguoja dabartinį vaizdą, naudodamas gradientinį nusileidimą (ar kitą optimizavimo algoritmą), kad sumažintų bendrą nuostolį, kuris yra visų trijų nuostolių svertinė suma.
✍️ Pavyzdys: Stiliaus perkėlimas
Klausimai po paskaitos
Išvada
Šioje pamokoje sužinojote apie GAN ir kaip juos mokyti. Taip pat sužinojote apie specialius iššūkius, su kuriais gali susidurti šio tipo neuroniniai tinklai, ir keletą strategijų, kaip juos įveikti.
🚀 Iššūkis
Peržiūrėkite Stiliaus perkėlimo užrašų knygelę, naudodami savo vaizdus.
Peržiūra ir savarankiškas mokymasis
Norėdami gauti daugiau informacijos apie GAN, skaitykite šiuos šaltinius:
- Marco Pasini, 10 pamokų, kurias išmokau mokydamas GAN vienerius metus
- StyleGAN, de facto GAN architektūra, kurią verta apsvarstyti
- Generatyvinio meno kūrimas naudojant GAN Azure ML
Užduotis
Peržiūrėkite vieną iš dviejų užrašų knygelių, susijusių su šia pamoka, ir iš naujo apmokykite GAN naudodami savo vaizdus. Ką galite sukurti?