Turinys[Slėpti][Rodyti]
Smegenys yra panašios į neuroninius tinklus. Tai yra analogija, kuri paprastai naudojama siekiant padėti naujam žmogui suprasti mašininio mokymosi ir dirbtinių neuroninių tinklų idėjas.
Kadangi užkulisiuose vyksta keli matematinių ir statistinių skaičiavimų sluoksniai, šių tinklų apibrėžimas kaip matematinė funkcija yra pažangesnis metodas.
Tai skirta žmonėms, kurie iš tikrųjų domisi mašininiu mokymusi ir nori pamatyti, kaip rašomas Python neuroninio tinklo kodas.
Šiame straipsnyje parodysime, kaip nuo nulio sukurti visiškai prijungtą giluminį neuroninį tinklą (DNN). Pitonas 3.
Mūsų Python neuroninio tinklo kodo failų struktūros apžvalga
Čia bus sukurti trys failai. Pirmasis yra paprastas nn.py failas, kuris bus aptartas skyriuose „Pagalbinių funkcijų nustatymas“ ir „Neuroninio tinklo kūrimas nuo nulio“.
Taip pat turėsime failą mnist loader.py, kad įkeltume bandymo duomenis, kaip aprašyta skyriuje „MNIST duomenų įkėlimas“.
Galiausiai turėsime failą, pavadintą test.py, kuris bus paleistas terminale, kad išbandytų mūsų neuroninį tinklą.
Šis failas išsamiai aprašytas skyriuje „Testų vykdymas“.
montavimas
NumPy Python biblioteką reikia atsisiųsti, kad galėtumėte sekti šią mokymo programą. Tai galite padaryti naudodami šią komandą terminale:
Modulių importavimas ir pagalbinės funkcijos nustatymas
Vienintelės dvi bibliotekos, kurių mums reikia, yra atsitiktinės ir „NumPy“, kurias importuosime iš karto. Pradinius neuroninio tinklo svorius sumaišysime naudodami atsitiktinę biblioteką.
Norėdami pagreitinti skaičiavimus, naudosime NumPy arba np (pagal susitarimą jis dažnai importuojamas kaip np). Mūsų dvi pagalbinės funkcijos bus atliekamos po mūsų importo. Dvi sigmoidinės funkcijos: viena ir sigmoidinis pirminis.
Logistinė regresija klasifikuos duomenis naudojant sigmoidinę funkciją, o atgalinis sklidimas apskaičiuos delta arba gradientą naudojant sigmoidinę pirminę funkciją.
Tinklo klasės kūrimas
Vienintelis šio skyriaus tikslas yra sukurti visiškai susietą neuroninį tinklą. Tinklo klasė apims visas kitas funkcijas. Funkcija Object() { [native code] } iš pradžių bus sukurta mūsų tinklo klasėje.
Vienas argumentas, dydis, reikalingas funkcijai Object() { [native code] }. Dydžių kintamasis yra skaitinių reikšmių rinkinys, nurodantis įvesties mazgų, esančių kiekviename mūsų neuroninio tinklo sluoksnyje, skaičių.
Savo __init__ metodu inicijuojame keturias ypatybes. Įvesties kintamieji, dydžiai, naudojami atitinkamai nustatyti sluoksnių dydžių sąrašą ir sluoksnių skaičių, sluoksnių skaičių.
Pirmas žingsnis yra atsitiktinai priskirti pradinius tinklo paklaidas kiekvienam sluoksniui, kuris seka įvesties sluoksniu.
Galiausiai, kiekviena sąsaja tarp įvesties ir išvesties sluoksnių turi atsitiktinai sugeneruotą svorį. Np.Random.Randn() pateikia atsitiktinę imtį, paimtą iš normaliojo konteksto skirstinio.
Tiekimo pirmyn funkcija
Neuroniniame tinkle informacija siunčiama pirmyn naudojant grįžtamojo ryšio funkciją. Šiai funkcijai reikės vieno argumento a, nurodančio esamą aktyvavimo vektorių.
Ši funkcija įvertina aktyvinimus kiekviename sluoksnyje, kartodama visus tinklo paklaidas ir svorius. Pateiktas atsakymas yra numatymas, kuris yra paskutinio sluoksnio aktyvacijos.
Mini-partinis gradiento nusileidimas
Mūsų tinklo klasės darbo arkliukas yra Gradient Descent. Šioje versijoje naudojame mini partijos (stochastinį) gradiento nusileidimą, modifikuotą gradiento nusileidimo variantą.
Tai rodo, kad modeliui atnaujinti bus naudojama nedidelė duomenų taškų grupė. Šiam metodui perduodami keturi privalomi ir vienas pasirenkamas argumentas. Keturi būtini kintamieji yra mokymo duomenų rinkinys, epochų skaičius, mini partijų dydis ir mokymosi greitis (eta).
Bandymų duomenis galima gauti paprašius. Bandymų duomenis pateiksime, kai galiausiai įvertinsime šį tinklą. Šios funkcijos pavyzdžių skaičius iš pradžių nustatomas pagal sąrašo ilgį, kai mokymo duomenys paverčiami sąrašo tipu.
Tą patį procesą taip pat taikome pateiktiems duomenims tikrinti. Taip yra todėl, kad užuot grąžinę mums kaip sąrašus, jie iš tikrųjų yra sąrašų ZIP. Kai vėliau įkelsime MNIST duomenų pavyzdžius, sužinosime apie tai daugiau.
Jei galime įsitikinti, kad pateikiame abiejų tipų duomenis kaip sąrašus, šis tipas nebūtinai yra būtinas.
Kai turime duomenis, mes perkeliame mokymo epochas. Mokymo laikotarpis yra tik vienas neuroninio tinklo mokymo etapas. Prieš sudarydami mažų partijų sąrašą, pirmiausia sumaišome kiekvienos epochos duomenis, kad užtikrintume atsitiktinumą.
Atnaujinimo mini paketo funkcija, kuri aptariama toliau, bus iškviesta kiekvienai mini paketai. Bandymo tikslumas taip pat bus grąžintas, jei bus gauti bandymo duomenys.
Išlaidų išvestinė pagalbinė funkcija
Pirmiausia sukurkime pagalbinę funkciją, vadinamą sąnaudų išvestine priemone, prieš iš tikrųjų kurdami atgalinio sklaidos kodą. Jei padarysime klaidą savo išvesties sluoksnyje, tai parodys išlaidų išvestinė funkcija.
Tam reikia dviejų įėjimų: išvesties aktyvinimo masyvo ir numatomų išvesties verčių y koordinačių.
Atgalinio dauginimo funkcija
Turime turėti omenyje mūsų dabartinį aktyvavimo vektorių, aktyvavimą, taip pat visus kitus aktyvavimo vektorius, aktyvacijas ir z vektorius, zs. Pirmiausia suaktyvinamas sluoksnis, vadinamas įvesties sluoksniu.
Mes peržiūrėsime kiekvieną poslinkį ir svorį juos sudėję. Kiekvienoje kilpoje apskaičiuojamas z vektorius kaip svorių ir aktyvinimo taškinė sandauga, įtraukiamas į zs sąrašą, perskaičiuojamas aktyvinimas ir atnaujintas aktyvinimas įtraukiamas į aktyvinimų sąrašą.
Galiausiai, matematika. Delta, kuri yra lygi ankstesnio sluoksnio paklaidai, padaugintai iš paskutinio zs vektorių elemento sigmoidinio pirminio skaičiaus, apskaičiuojamas prieš pradedant judėjimą atgal.
Paskutinis nabla b sluoksnis nustatytas kaip delta, o galutinis nabla w sluoksnis yra delta ir nuo antro iki paskutinio aktyvinimo sluoksnio taškinis sandauga (perkelta, kad iš tikrųjų galėtume atlikti skaičiavimus) .
Tęsiame kaip anksčiau, pradedant nuo antrojo sluoksnio ir baigiant paskutiniu, o užbaigę šiuos paskutinius sluoksnius kartojame procesą. Tada nablas grąžinamas kaip rinkinys.
Atnaujinamas mini paketinis gradiento nusileidimas
Mūsų SGD (stochastinio gradiento nusileidimo) metodas apima mini paketinį atnaujinimą. Kadangi jis naudojamas SGD, bet taip pat reikalauja backprop, svarsčiau, kur įdėti šią funkciją.
Galiausiai nusprendžiau paskelbti jį čia. Jis pradedamas generuojant 0 paklaidų ir svorių nablas vektorių, kaip tai padarė mūsų backprop funkcija.
Tam reikalinga mažoji paketo ir eta mokymosi sparta kaip dvi įvesties. Tada mini partijoje naudojame funkciją backprop, kad gautume kiekvienos įvesties x ir išvesties y delta vertę. Tada nabla sąrašai atnaujinami naudojant šias deltas.
Galiausiai mes naudojame mokymosi greitį ir nablas, kad atnaujintume tinklo svorį ir paklaidas. Kiekviena reikšmė atnaujinama iki naujausios vertės, atėmus mokymosi greitį, padaugintą iš mažos partijos dydžio, tada pridedama prie nabla vertės.
Įvertinkite funkciją
Vertinimo funkcija yra paskutinė, kurią turime parašyti. Bandymo duomenys yra vienintelė šios funkcijos įvestis. Šioje funkcijoje mes lyginame tik tinklo išėjimus su numatomu rezultatu, y. Tiekiant įėjimą, x, pirmyn, nustatomi tinklo išėjimai.
Pilnas kodas
Kai sujungiame visą kodą, jis atrodo taip.
Neuroninio tinklo testavimas
Įkeliami MNIST duomenys
Šios MNIST duomenys yra .pkl.gz formatu, kurį atidarysime naudodami GZIP ir įkelsime marinatu. Parašykime greitą metodą, kaip įkelti šiuos duomenis kaip trijų dydžio rinkinį, padalintą į mokymo, patvirtinimo ir bandymo duomenis.
Kad būtų lengviau tvarkyti duomenis, parašysime kitą funkciją, kad užkoduotume y į 10 elementų masyvą. Masyve bus visi 0, išskyrus 1, atitinkantį tinkamą vaizdo skaitmenį.
Naudosime pagrindinius įkėlimo duomenis ir vieną karštojo kodavimo metodą, kad įkeltume duomenis į skaitomą formatą. Bus parašyta kita funkcija, kuri konvertuos mūsų x reikšmes į 784 dydžio sąrašą, atitinkantį vaizdo 784 pikselius, ir mūsų y reikšmes į vieną karštą koduotą vektorinę formą.
Tada sujungsime x ir y reikšmes taip, kad vienas indeksas atitiktų kitą. Tai taikoma mokymo, patvirtinimo ir bandymo duomenų rinkiniams. Tada grąžiname pakeistus duomenis.
Vykdomi testai
Sukursime naują failą, pavadintą „mnist loader“, kuris importuos ir anksčiau sukurtą neuroninį tinklą (paprastą nn), ir MNIST duomenų rinkinio įkėlimo programą prieš pradėdami bandymą.
Šiame faile mums tereikia importuoti duomenis, sukurti tinklą, kurio įvesties sluoksnio dydis yra 784, o išvesties sluoksnio dydis yra 10, paleisti tinklo SGD funkciją treniruočių duomenims, tada išbandyti naudojant bandymo duomenis.
Atminkite, kad mūsų įvesties sluoksnių sąraše nėra skirtumo, koks skaičius yra tarp 784 ir 10. Kitus sluoksnius galime keisti kaip tik norime; tik įvesties ir išvesties dydžiai yra fiksuoti.
Trys sluoksniai nebūtini; galime naudoti keturis, penkis ar net tik du. Mėgaukitės su juo eksperimentuodami.
Išvada
Čia, naudodami Python 3, mes sukuriame neuroninį tinklą nuo nulio. Kartu su aukšto lygio matematika aptarėme ir įgyvendinimo specifiką.
Pradėjome nuo pagalbinių funkcijų diegimo. Kad neuronai veiktų, sigmoidinės ir sigmoidinės pagrindinės funkcijos yra labai svarbios. Tada praktiškai įgyvendinome grįžtamojo ryšio funkciją, kuri yra pagrindinis duomenų tiekimo į neuroninį tinklą procesas.
Tada sukūrėme gradiento nusileidimo funkciją Python, variklyje, kuris valdo mūsų neuronų tinklą. Kad būtų galima rasti „vietinius minimumus“ ir optimizuoti jų svorį bei paklaidas, mūsų neuroninis tinklas naudoja gradiento nusileidimą. Sukūrėme atgalinio dauginimo funkciją naudodami gradiento nusileidimas.
Pateikdama naujinimus, kai išėjimai neatitinka tinkamų etikečių, ši funkcija leidžia neuroniniam tinklui „mokytis“.
Galiausiai įdiegėme visiškai naują Python neuroninis tinklas į testą naudojant MNIST duomenų rinkinį. Viskas veikė sklandžiai.
Laimingo kodavimo!
Palikti atsakymą