Kazalo[Skrij][Pokaži]
Možgani so primerljivi z nevronskimi mrežami. To je analogija, ki se običajno uporablja za pomoč nekomu, ki se še ne spozna na temo, da razume ideje za strojnim učenjem in umetnimi nevronskimi mrežami.
Ker se v ozadju dogaja več plasti matematičnih in statističnih izračunov, je definiranje teh omrežij kot matematične funkcije naprednejša metoda.
To je za ljudi, ki jih dejansko zanima strojno učenje in želijo videti, kako je napisana koda nevronske mreže Python.
V tem članku bomo pokazali, kako sestaviti popolnoma povezano globoko nevronsko mrežo (DNN) od začetka v Python 3.
Pregled strukture datoteke za našo kodo nevronske mreže Python
Tu bodo ustvarjene tri datoteke. Prva je preprosta datoteka nn.py, o kateri bomo razpravljali v razdelkih »Nastavitev pomožnih funkcij« in »Gradnja nevronske mreže iz nič«.
Imeli bomo tudi datoteko z imenom mnist loader.py za nalaganje testnih podatkov, kot je opisano v »Nalaganje podatkov MNIST«.
Končno bomo imeli datoteko z imenom test.py, ki se bo zagnala v terminalu za testiranje naše nevronske mreže.
Ta datoteka je podrobno opisana v »Izvajanje preizkusov«.
namestitev
Če želite slediti tej vadnici, morate prenesti knjižnico NumPy Python. To lahko dosežete z uporabo naslednjega ukaza na terminalu:
Uvoz modulov in nastavitev funkcije Helper
Edini dve knjižnici, ki ju potrebujemo, sta random in NumPy, ki ju bomo uvozili takoj. Za začetne uteži naše nevronske mreže jih bomo premešali z uporabo naključne knjižnice.
Da bi pospešili naše izračune, bomo uporabili NumPy ali np (po dogovoru se pogosto uvaža kot np). Naši dve funkciji pomoči bosta narejeni po našem uvozu. Dve sigmoidni funkciji: ena in sigmoidna praštevila.
Logistična regresija bo razvrstila podatke z uporabo sigmoidne funkcije, medtem ko bo širjenje nazaj izračunala delto ali gradient z uporabo sigmoidne prafunkcije.
Ustvarjanje omrežnega razreda
Izgradnja popolnoma povezane nevronske mreže je edina tema tega razdelka. Omrežni razred bo zajemal vse funkcije, ki sledijo. Funkcija Object() { [domača koda] } bo na začetku ustvarjena v našem omrežnem razredu.
En argument, velikosti, zahteva funkcija Object() { [izvorna koda] }. Spremenljivka velikosti je zbirka številskih vrednosti, ki predstavlja število vhodnih vozlišč, prisotnih v vsaki plasti naše nevronske mreže.
V naši metodi __init__ inicializiramo štiri lastnosti. Vhodne spremenljivke, sizes, se uporabljajo za nastavitev seznama velikosti plasti oziroma števila plasti, num layers.
Prvi korak je naključna dodelitev začetnih pristranskosti našega omrežja vsaki plasti, ki sledi vhodni plasti.
Končno ima vsaka povezava med vhodno in izhodno plastjo naključno ustvarjene uteži. Np.Random.Randn() daje naključni vzorec, vzet iz običajne porazdelitve za kontekst.
Funkcija podajanja naprej
V nevronski mreži se informacije pošiljajo naprej s funkcijo posredovanja naprej. Ta funkcija bo zahtevala en argument, a, ki označuje trenutni aktivacijski vektor.
Ta funkcija oceni aktivacije na vsaki plasti s ponavljanjem vseh pristranskosti in uteži v omrežju. Podani odgovor je napoved, to je aktivacije zadnje plasti.
Mini-serija Gradient Descent
Delovni konj našega razreda Network je Gradient Descent. V tej različici uporabljamo mini-paketni (stohastični) gradientni spust, spremenjeno variacijo gradientnega spuščanja.
To pomeni, da bo za posodobitev našega modela uporabljena majhna serija podatkovnih točk. Štirje obvezni in en izbirni argument so posredovani tej metodi. Štiri zahtevane spremenljivke so nabor podatkov o usposabljanju, število epoh, velikost mini serij in stopnja učenja (eta).
Testni podatki so na voljo na zahtevo. Preskusne podatke bomo posredovali, ko bomo končno ocenili to omrežje. Število vzorcev v tej funkciji je na začetku nastavljeno na dolžino seznama, potem ko so podatki o usposabljanju preoblikovani v vrsto seznama.
Enak postopek uporabljamo tudi za testiranje podatkov, ki so vneseni. To je zato, ker namesto da bi nam bili vrnjeni kot seznami, so v resnici zadrge seznamov. Ko bomo pozneje naložili vzorce podatkov MNIST, bomo izvedeli več o tem.
Če lahko zagotovimo, da zagotovimo obe vrsti podatkov kot sezname, potem to ulivanje tipa ni nujno nujno.
Ko imamo podatke, gremo skozi obdobja usposabljanja v zanki. Obdobje usposabljanja je le en krog usposabljanja nevronske mreže. Podatke v vsakem obdobju najprej premešamo, da zagotovimo naključnost, preden naredimo seznam mini serij.
Funkcija posodobitve mini paketa, ki je obravnavana spodaj, bo poklicana za vsak mini paket. Natančnost testa bo prav tako vrnjena, če so na voljo testni podatki.
Pomožna funkcija na podlagi stroškov
Najprej razvijmo pomožno funkcijo, imenovano izpeljanka stroškov, preden zares ustvarimo kodo za širjenje nazaj. Če naredimo napako v naši izhodni plasti, bo to pokazala funkcija izpeljave stroškov.
Zahteva dva vhoda: niz izhodnih aktivacij in y-koordinate pričakovanih izhodnih vrednosti.
Funkcija širjenja nazaj
Upoštevati je treba naš trenutni aktivacijski vektor, aktivacijo, kot tudi vse druge aktivacijske vektorje, aktivacije in z-vektorje, zs. Najprej se aktivira sloj, imenovan vhodni sloj.
Pregledali bomo vsako pristranskost in težo, potem ko ju bomo postavili. Vsaka zanka vključuje izračun vektorja z kot pikčastega zmnožka uteži in aktivacije, dodajanje na seznam zs, ponoven izračun aktivacije in dodajanje posodobljene aktivacije na seznam aktivacij.
Končno matematika. Delta, ki je enaka napaki prejšnjega sloja, pomnoženi s sigmoidno praštevilo zadnjega elementa vektorjev zs, se izračuna, preden začnemo naš prehod nazaj.
Zadnja plast nabla b je nastavljena kot delta, končna plast nabla w pa je nastavljena kot pikčasti zmnožek delte in predzadnje plasti aktivacij (preneseno tako, da lahko dejansko izračunamo) .
Nadaljujemo kot prej, začnemo z drugo plastjo in zaključimo z zadnjo ter postopek ponovimo, ko zaključimo te zadnje plasti. Nable se nato vrnejo kot tuple.
Posodabljanje minipaketnega gradientnega spuščanja
Naša metoda SGD (stohastični gradientni spust) od prej vključuje posodabljanje mini paketov. Ker se uporablja v SGD, vendar zahteva tudi backprop, sem razpravljal, kam naj postavim to funkcijo.
Končno sem se odločil, da ga objavim tukaj. Začne se z generiranjem 0 vektorjev nablasov pristranskosti in uteži, tako kot je to storila naša funkcija backprop.
Kot dva vhoda zahteva mini-serijo in stopnjo učenja eta. V mini paketu nato uporabimo funkcijo backprop, da pridobimo delto vsake matrike nabla za vsak vhod, x, in izhod, y. Seznami nabla se nato posodobijo s temi deltami.
Na koncu uporabimo stopnjo učenja in nablas za posodobitev uteži in pristranskosti omrežja. Vsaka vrednost je posodobljena na najnovejšo vrednost, zmanjšano za stopnjo učenja, pomnoženo z velikostjo miniserije in nato dodana vrednosti nabla.
Oceni funkcijo
Funkcija evaluate je zadnja, ki jo moramo napisati. Testni podatki so edini vhod za to funkcijo. V tej funkciji samo primerjamo izhode omrežja s pričakovanim rezultatom, y. S podajanjem vhoda x naprej se določijo izhodi omrežja.
Popolna koda
Ko združimo vso kodo, je videti tako.
Testiranje nevronske mreže
Nalaganje podatkov MNIST
O Podatki MNIST je v formatu .pkl.gz, ki ga bomo odprli z GZIP in naložili s pickle. Napišimo hitro metodo za nalaganje teh podatkov kot tuple velikosti tri, razdeljeno na podatke za usposabljanje, preverjanje veljavnosti in testne podatke.
Da bi olajšali upravljanje naših podatkov, bomo napisali še eno funkcijo za kodiranje y v matriko z 10 elementi. Matrika bo vsebovala ničle, razen 0, ki se ujema s pravo številko slike.
Za nalaganje podatkov v berljivo obliko bomo uporabili osnovne podatke o nalaganju in eno metodo vročega kodiranja. Napisana bo še ena funkcija, ki bo naše vrednosti x pretvorila v seznam velikosti 784, ki se ujema s 784 slikovnimi pikami, in naše vrednosti y v njihovo eno samo vroče kodirano vektorsko obliko.
Nato bomo združili vrednosti x in y tako, da se en indeks ujema z drugim. To velja za nabore podatkov o usposabljanju, validaciji in testih. Nato vrnemo spremenjene podatke.
Tekaški testi
Naredili bomo novo datoteko z imenom »mnist loader«, ki bo uvozila nevronsko mrežo, ki smo jo predhodno vzpostavili (enostavno nn), in nalagalnik nabora podatkov MNIST, preden začnemo s testiranjem.
V tej datoteki moramo samo uvoziti podatke, zgraditi omrežje z velikostjo vhodne plasti 784 in velikostjo izhodne plasti 10, zagnati omrežno funkcijo SGD na podatkih za usposabljanje, nato pa jo preizkusiti s testnimi podatki.
Upoštevajte, da za naš seznam vhodnih slojev ni pomembno, katera številka je med 784 in 10. Druge sloje lahko spreminjamo poljubno; le vhodne in izhodne velikosti so določene.
Tri plasti niso potrebne; lahko uporabimo štiri, pet ali celo samo dva. Zabavajte se z eksperimentiranjem.
zaključek
Tu z uporabo Pythona 3 ustvarimo nevronsko mrežo iz nič. Ob visoki matematiki smo se pogovarjali tudi o posebnostih izvedbe.
Začeli smo z implementacijo pomožnih funkcij. Za delovanje nevronov sta ključnega pomena sigmoidna in sigmoidna primarna funkcija. Nato smo v prakso uvedli funkcijo posredovanja naprej, ki je temeljni proces za podajanje podatkov v nevronsko mrežo.
Nato smo ustvarili funkcijo gradientnega spuščanja v Pythonu, motorju, ki poganja našo nevronsko mrežo. Da bi našli "lokalne minimume" in optimizirali njihove uteži in pristranskosti, naša nevronska mreža uporablja gradientni spust. Ustvarili smo funkcijo povratnega širjenja z uporabo gradientni spust.
Z zagotavljanjem posodobitev, ko se rezultati ne ujemajo z ustreznimi oznakami, ta funkcija omogoča nevronski mreži, da se »uči«.
Končno smo postavili naš čisto nov Python nevronska mreža na test z uporabo nabora podatkov MNIST. Vse je delovalo gladko.
Srečno kodiranje!
Pustite Odgovori