Pregled sadržaja[Sakriti][Pokazati]
Mozak je usporediv s neuronskim mrežama. Ovo je analogija koja se obično koristi kako bi se pomoglo nekome tko je tek upoznao tu temu da razumije ideje iza strojnog učenja i umjetnih neuronskih mreža.
Budući da postoji nekoliko slojeva matematičkih i statističkih izračuna koji se odvijaju iza kulisa, definiranje tih mreža kao matematičke funkcije je naprednija metoda.
Ovo je za ljude koji su stvarno zainteresirani za strojno učenje i žele vidjeti kako se piše kod Python neuronske mreže.
U ovom ćemo članku pokazati kako konstruirati potpuno povezanu duboku neuronsku mrežu (DNN) od nule u Piton 3.
Pregled strukture datoteke za naš kod Python neuronske mreže
Ovdje će se stvoriti tri datoteke. Prva je jednostavna datoteka nn.py, o kojoj će se raspravljati u "Postavljanje pomoćnih funkcija" i "Izgradnja neuronske mreže od nule".
Također ćemo imati datoteku pod nazivom mnist loader.py za učitavanje testnih podataka, kao što je opisano u “Učitavanje MNIST podataka”.
Konačno, imat ćemo datoteku pod nazivom test.py koja će se pokrenuti na terminalu za testiranje naše neuronske mreže.
Ova je datoteka detaljno opisana u odjeljku "Izvođenje testova".
Montaža
Biblioteka NumPy Python mora se preuzeti kako biste mogli pratiti ovaj vodič. To možete postići korištenjem sljedeće naredbe na terminalu:
Uvoz modula i postavljanje Helper funkcije
Jedine dvije biblioteke koje su nam potrebne su random i NumPy, koje ćemo odmah uvesti. Za početne težine naše neuronske mreže, pomiješat ćemo ih pomoću nasumične biblioteke.
Kako bismo ubrzali svoje izračune, koristit ćemo NumPy ili np (po konvenciji, često se uvozi kao np). Naše dvije pomoćne funkcije bit će napravljene nakon našeg uvoza. Dvije sigmoidne funkcije: jedan i sigmoidni prime.
Logistička regresija će klasificirati podatke pomoću sigmoidne funkcije, dok će povratno širenje izračunati delta ili gradijent pomoću sigmoidne proste funkcije.
Stvaranje mrežne klase
Izgradnja potpuno povezane neuronske mreže jedini je fokus ovog odjeljka. Mrežna klasa će obuhvatiti sve funkcije koje slijede. Funkcija Object() { [nativni kod] } početno će se kreirati u našoj mrežnoj klasi.
Jedan argument, veličine, zahtijeva funkcija Object() { [nativni kod] }. Varijabla veličina skup je numeričkih vrijednosti koje predstavljaju broj ulaznih čvorova prisutnih u svakom sloju naše neuronske mreže.
Inicijaliziramo četiri svojstva u našoj metodi __init__. Ulazne varijable, sizes, koriste se za postavljanje popisa veličina slojeva odnosno broja slojeva, num layers.
Prvi korak je nasumično dodijeliti početne pristranosti naše mreže svakom sloju koji slijedi ulazni sloj.
Konačno, svaka poveznica između ulaznog i izlaznog sloja ima svoje težine nasumično generirane. Np.Random.Randn() daje nasumični uzorak izvučen iz normalne distribucije za kontekst.
Funkcija napredovanja
U neuronskoj mreži informacije se šalju naprijed funkcijom feedforward. Ova će funkcija zahtijevati jedan argument, a, koji pokazuje trenutni aktivacijski vektor.
Ova funkcija procjenjuje aktivacije na svakom sloju ponavljajući sve pristranosti i težine u mreži. Dobiveni odgovor je predviđanje, a to su aktivacije posljednjeg sloja.
Mini-serija Gradient Descent
Radni konj naše klase Network je Gradient Descent. U ovoj verziji koristimo mini-serijski (stohastički) gradijentni spuštanje, modificiranu varijaciju gradijentnog spuštanja.
To znači da će se mala serija podatkovnih točaka koristiti za ažuriranje našeg modela. Četiri obavezna i jedan izborni argument prosljeđuju se ovoj metodi. Četiri potrebne varijable su skup podataka za obuku, broj epoha, veličina mini-serija i stopa učenja (eta).
Podaci o ispitivanju dostupni su na zahtjev. Isporučit ćemo testne podatke kada konačno procijenimo ovu mrežu. Broj uzoraka u ovoj funkciji početno je postavljen na duljinu popisa nakon što se podaci o obuci transformiraju u vrstu popisa.
Također primjenjujemo isti postupak za testiranje podataka koji se daju. To je zato što umjesto da nam se vraćaju kao popisi, oni su zapravo zipovi popisa. Kada kasnije učitamo uzorke podataka MNIST-a, saznat ćemo više o tome.
Ako se možemo pobrinuti da pružimo obje vrste podataka kao popise, onda ovaj tip nije nužno neophodan.
Kada imamo podatke, prelazimo kroz epohe obuke u petlji. Razdoblje obuke je samo jedan krug obuke neuronske mreže. Prvo miješamo podatke u svakoj epohi kako bismo osigurali slučajnost prije nego napravimo popis mini-serija.
Funkcija ažuriranja mini serije, o kojoj se govori u nastavku, bit će pozvana za svaku mini seriju. Točnost testa također će biti vraćena ako su podaci testa dostupni.
Pomoćna funkcija derivacije troškova
Razvijmo pomoćnu funkciju koja se zove derivativna cijena prije nego što stvarno stvorimo kod za širenje unatrag. Ako pogriješimo u našem izlaznom sloju, funkcija izvedenice troškova će to pokazati.
Zahtijeva dva ulaza: niz izlaznih aktivacija i y-koordinate očekivanih izlaznih vrijednosti.
Funkcija širenja unatrag
Naš sadašnji aktivacijski vektor, aktivaciju, kao i sve druge aktivacijske vektore, aktivacije i z-vektore, zs, moramo imati na umu. Prvo se aktivira sloj koji se naziva ulazni sloj.
Proći ćemo kroz svaku pristranost i težinu nakon što ih postavimo. Svaka petlja uključuje izračunavanje vektora z kao točkastog umnoška težina i aktivacije, njegovo dodavanje na popis zs, ponovno izračunavanje aktivacije i dodavanje ažurirane aktivacije na popis aktivacija.
Na kraju, matematika. Delta, koja je jednaka pogrešci iz prethodnog sloja pomnoženoj sa sigmoidnim prostim brojem posljednjeg elementa zs vektora, izračunava se prije nego što započnemo naš prolaz unatrag.
Posljednji sloj nabla b postavljen je da bude delta, a posljednji sloj nabla w postavljen je kao točkasti umnožak delte i pretposljednjeg sloja aktivacija (transponirano tako da zapravo možemo izračunati) .
Nastavljamo kao i prije, počevši od drugog sloja i završavajući s posljednjim, te ponavljamo postupak nakon završetka ovih zadnjih slojeva. Nablas se zatim vraćaju kao tuple.
Ažuriranje mini-serije gradijentnog spuštanja
Naša SGD (stochastic gradient descent) metoda od prije uključuje ažuriranje mini-serija. Budući da se koristi u SGD-u, ali zahtijeva i potporni podupirač, raspravljao sam gdje staviti ovu funkciju.
Napokon sam odlučio objaviti ga ovdje. Započinje generiranjem 0 vektora nablasa odstupanja i težine, baš kao što je to učinila naša backprop funkcija.
Zahtijeva mini-seriju i eta stopu učenja kao svoja dva ulaza. U mini-seriji zatim koristimo funkciju backprop za dobivanje delta svakog niza nabla za svaki ulaz, x, i izlaz, y. Popisi nabla se zatim ažuriraju ovim deltama.
Konačno, koristimo stopu učenja i nablas za ažuriranje mrežnih težina i pristranosti. Svaka se vrijednost ažurira na najnoviju vrijednost, umanjenu za stopu učenja, pomnoženu s veličinom minibatcha, a zatim dodanu vrijednosti nabla.
Procijenite funkciju
Funkcija evaluate je zadnja koju trebamo napisati. Testni podaci jedini su ulaz za ovu funkciju. U ovoj funkciji samo uspoređujemo izlaze mreže s očekivanim rezultatom, y. Postavljanjem ulaza, x, naprijed, određuju se izlazi mreže.
Kompletan kod
Kada kombiniramo sav kod, ovako izgleda.
Testiranje neuronske mreže
Učitavanje MNIST podataka
Korištenje električnih romobila ističe Podaci MNIST-a je u .pkl.gz formatu, koji ćemo otvoriti pomoću GZIP-a i učitati s pickleom. Napišimo brzu metodu za učitavanje ovih podataka kao torke veličine tri, podijeljene na podatke za obuku, provjeru valjanosti i testne podatke.
Kako bismo olakšali upravljanje našim podacima, napisat ćemo još jednu funkciju za kodiranje y u polje od 10 stavki. Niz će biti sve 0 osim 1 koji odgovara ispravnoj znamenki slike.
Koristit ćemo osnovne podatke o učitavanju i jednu metodu vrućeg kodiranja za učitavanje podataka u čitljiv format. Bit će napisana još jedna funkcija koja će pretvoriti naše x vrijednosti u popis veličine 784, koji odgovara 784 piksela slike, i naše y vrijednosti u njihov jedinstveni vruće kodirani vektorski oblik.
Zatim ćemo kombinirati x i y vrijednosti tako da jedan indeks odgovara drugom. Ovo se odnosi na skupove podataka za obuku, validaciju i testiranje. Zatim vraćamo promijenjene podatke.
Pokretanje testova
Napravit ćemo novu datoteku pod nazivom "mnist loader" koja će uvesti i neuronsku mrežu koju smo prethodno uspostavili (jednostavno nn) i MNIST skup podataka za učitavanje prije nego što započnemo testiranje.
U ovoj datoteci, sve što trebamo učiniti je uvesti podatke, izgraditi mrežu s veličinom ulaznog sloja od 784 i veličinom izlaznog sloja od 10, pokrenuti mrežnu funkciju SGD na podacima za obuku, zatim je testirati pomoću testnih podataka.
Imajte na umu da za naš popis ulaznih slojeva nema razlike koji su brojevi između 784 i 10. Ostale slojeve možemo promijeniti kako god želimo; samo su ulazne i izlazne veličine fiksne.
Tri sloja nisu potrebna; možemo koristiti četiri, pet ili čak samo dva. Zabavite se eksperimentirajući s njim.
Zaključak
Ovdje, koristeći Python 3, stvaramo neuronsku mrežu od nule. Uz matematiku visoke razine, razgovarali smo io specifičnostima implementacije.
Počeli smo s implementacijom pomoćnih funkcija. Za rad neurona ključne su funkcije sigmoida i sigmoida. Zatim smo stavili u praksu funkciju feedforward, koja je temeljni proces za unos podataka u neuronsku mrežu.
Zatim smo stvorili funkciju gradijentnog spuštanja u Pythonu, stroju koji pokreće našu neuronsku mrežu. Kako bismo locirali "lokalne minimume" i optimizirali njihove težine i pristranosti, naša neuronska mreža koristi gradijentni pad. Stvorili smo funkciju povratnog širenja pomoću gradijentni spust.
Isporukom ažuriranja kada rezultati ne odgovaraju ispravnim oznakama, ova funkcija omogućuje neuronskoj mreži "učenje".
Konačno, stavili smo naš potpuno novi Python neuronska mreža testirati pomoću MNIST skupa podataka. Sve je funkcioniralo glatko.
Sretno kodiranje!
Ostavi odgovor