Sadržaj[Sakrij][Prikaži]
Mozak je uporediv sa neuronskim mrežama. Ovo je analogija koja se obično koristi kako bi se pomoglo nekome ko je novi u ovoj temi da razumije ideje iza mašinskog učenja i umjetnih neuronskih mreža.
Budući da postoji nekoliko slojeva matematičkih i statističkih proračuna koji se odvijaju iza scene, definiranje ovih mreža kao matematičke funkcije je naprednija metoda.
Ovo je za ljude koji su zapravo zainteresirani za strojno učenje i žele vidjeti kako je napisan kod Python neuronske mreže.
U ovom članku ćemo pokazati kako konstruirati potpuno povezanu duboku neuronsku mrežu (DNN) od nule u piton 3.
Pregled strukture datoteke za naš Python kod neuronske mreže
Ovdje će biti kreirana tri fajla. Prva je jednostavna datoteka nn.py, o kojoj će biti riječi 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 biti pokrenuta u terminalu za testiranje naše neuronske mreže.
Ova datoteka je detaljno opisana u "Pokretanju testova".
instalacija
NumPy Python biblioteku morate preuzeti da biste pratili ovaj vodič. To možete postići korištenjem sljedeće naredbe na terminalu:
Uvoz modula i postavljanje funkcije pomoćnika
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, promiješat ćemo ih pomoću nasumične biblioteke.
Da bismo ubrzali naše proračune, koristićemo NumPy ili np (po konvenciji se često uvozi kao np). Naše dvije pomoćne funkcije će biti napravljene nakon našeg uvoza. Dvije sigmoidne funkcije: jedna i sigmoidna primarna funkcija.
Logistička regresija će klasifikovati podatke koristeći sigmoidnu funkciju, dok će backpropagacija izračunati delta ili gradijent koristeći sigmoidnu primarnu funkciju.
Kreiranje mrežne klase
Izgradnja potpuno povezane neuronske mreže je jedini fokus ovog odjeljka. Mrežna klasa će obuhvatiti sve funkcije koje dolaze nakon toga. Funkcija Object() { [nativni kod] } će biti kreirana u početku u našoj mrežnoj klasi.
Funkcija Object() { [nativni kod] } zahtijeva jedan argument, veličine. Varijabla sizes je zbirka numeričkih vrijednosti koja predstavlja broj ulaznih čvorova prisutnih u svakom sloju naše neuronske mreže.
Inicijaliziramo četiri svojstva u našoj metodi __init__. Ulazne varijable, veličine, koriste se za postavljanje liste veličina slojeva i broja slojeva, odnosno broja slojeva.
Prvi korak je da nasumično dodijelimo početne predrasude naše mreže svakom sloju koji slijedi nakon ulaznog sloja.
Konačno, svaka veza između ulaznog i izlaznog sloja ima svoje težine nasumično generirane. Np.Random.Randn() daje slučajni uzorak izvučen iz normalne distribucije za kontekst.
Funkcija napredovanja
U neuronskoj mreži, informacije se šalju naprijed putem feedforward funkcije. Ova funkcija će zahtijevati jedan argument, a, koji označava trenutni vektor aktivacije.
Ova funkcija procjenjuje aktivacije na svakom sloju iteracijom preko svih predrasuda i težine u mreži. Dati odgovor je predviđanje, što je aktivacija posljednjeg sloja.
Mini serija Gradijentnog spuštanja
Radni konj naše klase mreže je Gradient Descent. U ovoj verziji koristimo mini-batch (stohastički) gradijentni spust, modificiranu varijaciju gradijentnog spuštanja.
Ovo ukazuje da će se mala serija podataka koristiti za ažuriranje našeg modela. Četiri obavezna i jedan opcioni argument se prosleđuju 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. Dostavit ćemo testne podatke kada na kraju procijenimo ovu mrežu. Broj uzoraka u ovoj funkciji je inicijalno postavljen na dužinu liste nakon što se podaci obuke transformišu u tip liste.
Isti proces primjenjujemo i na testne podatke koji su dati. To je zato što umjesto da nam se vrate kao liste, oni su zapravo zipovi lista. Kada kasnije učitamo uzorke podataka MNIST, saznat ćemo više o tome.
Ako možemo osigurati da pružamo obje vrste podataka kao liste, onda ovo uvođenje tipa nije nužno neophodno.
Kada imamo podatke, prelazimo kroz epohe obuke u petlji. Period obuke je samo jedan krug obuke neuronske mreže. Prvo miješamo podatke u svakoj epohi kako bismo osigurali slučajnost prije nego što napravimo listu mini serija.
Funkcija mini paketa ažuriranja, o kojoj se govori u nastavku, biće pozvana za svaki mini paket. Točnost testa će također biti vraćena ako su podaci testa dostupni.
Funkcija pomoćnika koja se izvodi po troškovima
Hajde da prvo razvijemo pomoćnu funkciju koja se zove izvod troškova pre nego što zaista kreiramo kod za širenje unazad. Ako napravimo grešku u našem izlaznom sloju, funkcija derivata troškova će to pokazati.
Zahtijeva dva ulaza: niz izlaznih aktivacija i y-koordinate predviđenih izlaznih vrijednosti.
Funkcija propagacije unazad
Naš sadašnji vektor aktivacije, aktivacija, kao i bilo koji drugi aktivacijski vektor, aktivacija i z-vektori, zs, moraju se imati na umu. Prvi se aktivira sloj koji se zove ulazni sloj.
Proći ćemo kroz svaku pristrasnost i težinu nakon što ih postavimo. Svaka petlja uključuje izračunavanje z vektora kao tačkastog proizvoda težine i aktivacije, dodavanje na listu zs, ponovno izračunavanje aktivacije i dodavanje ažurirane aktivacije na listu aktivacija.
Konačno, matematika. Delta, koja je jednaka grešci iz prethodnog sloja pomnoženoj sa sigmoidnim prostim brojem posljednjeg elementa zs vektora, izračunava se prije nego što započnemo naš povratak unatrag.
Posljednji sloj nabla b je postavljen da bude delta, a konačni sloj nabla w postavljen je da bude tačkasti proizvod delte i pretposljednjeg sloja aktivacija (transponirano tako da zapravo možemo izvršiti matematiku) .
Nastavljamo kao i ranije, počevši od drugog sloja i zaključno sa posljednjim, a postupak ponavljamo nakon završetka ovih posljednjih slojeva. Nabla se zatim vraćaju kao torka.
Ažuriranje Mini-serije gradijenta spuštanja
Naša metoda SGD (stohastički gradijentni spuštanje) od ranije uključuje ažuriranje mini serije. Pošto se koristi u SGD-u, ali takođe zahteva backprop, raspravljao sam gde da stavim ovu funkciju.
Konačno sam odlučio da ga objavim ovdje. Počinje generiranjem 0 vektora nabla prednapona i težine, baš kao što je to učinila naša backprop funkcija.
Zahtijeva mini-batch i eta stopu učenja kao svoja dva ulaza. U mini-batchu, tada koristimo backprop funkciju da dobijemo deltu svakog nabla niza za svaki ulaz, x i izlaz, y. Nabla liste se zatim ažuriraju ovim deltama.
Konačno, koristimo brzinu učenja i nablas da ažuriramo težine i predrasude mreže. Svaka vrijednost se ažurira na najnoviju vrijednost, umanjenu za stopu učenja, pomnoženu s veličinom mini serije, a zatim dodaju nabla vrijednosti.
Procijenite funkciju
Funkcija evaluacije je zadnja koju trebamo napisati. Testni podaci su jedini ulaz za ovu funkciju. U ovoj funkciji samo uspoređujemo izlaze mreže sa očekivanim rezultatom, y. Napajanjem ulaza, x, naprijed, određuju se izlazi mreže.
Kompletan kod
Kada spojimo sav kod, izgleda ovako.
Testiranje neuronske mreže
Učitavanje MNIST podataka
The MNIST podaci je u .pkl.gz formatu, koji ćemo otvoriti pomoću GZIP-a i učitati s pickle-om. Napišimo brzu metodu za učitavanje ovih podataka kao torku veličine tri, podijeljenu na podatke za obuku, validaciju i test.
Da bismo olakšali upravljanje našim podacima, napisat ćemo drugu funkciju za kodiranje y u niz od 10 stavki. Niz će imati sve 0 osim 1 koja odgovara pravilnoj cifri slike.
Koristit ćemo osnovne podatke za učitavanje i jednu metodu vrućeg kodiranja za učitavanje naših podataka u čitljiv format. Druga funkcija će biti napisana koja će pretvoriti naše x vrijednosti u listu veličine 784, koja odgovara 784 piksela slike, i naše y vrijednosti u njihov jedinstveni vrući kodirani vektorski oblik.
Zatim ćemo kombinirati vrijednosti x i y tako da jedan indeks odgovara drugom. Ovo se odnosi na skupove podataka za obuku, validaciju i testiranje. Zatim vraćamo izmijenjene podatke.
Running Tests
Napravit ćemo novu datoteku pod nazivom “mnist loader” koja će uvesti i neuronsku mrežu koju smo prethodno uspostavili (jednostavan nn) i učitavač skupa podataka MNIST prije nego počnemo testirati.
U ovoj datoteci sve što treba da uradimo je da uvezemo podatke, izgradimo mrežu sa veličinom ulaznog sloja od 784 i veličinom izlaznog sloja od 10, pokrenemo mrežnu SGD funkciju na podacima o obuci, a zatim je testiramo koristeći podatke testa.
Imajte na umu da za našu listu ulaznih slojeva nije bitno koji su brojevi između 784 i 10. Ostale slojeve možemo mijenjati kako god želimo; samo ulazne i izlazne veličine su fiksne.
Tri sloja nisu potrebna; mogli bismo koristiti četiri, pet ili čak samo dva. Zabavite se eksperimentirajući s njim.
zaključak
Ovdje, koristeći Python 3, kreiramo neuronsku mrežu od nule. Uz matematiku visokog nivoa, razgovarali smo i o specifičnostima implementacije.
Počeli smo s implementacijom pomoćnih funkcija. Da bi neuroni radili, sigmoidna i sigmoidna primarna funkcija su ključne. Zatim smo implementirali u praksu funkciju feedforward, koja je osnovni proces za unos podataka u neuronsku mrežu.
Zatim smo kreirali funkciju gradijenta spuštanja u Pythonu, motoru koji pokreće našu neuronsku mrežu. Kako bi locirali “lokalne minimume” i optimizirali njihove težine i predrasude, naša neuronska mreža koristi gradijentni pad. Kreirali smo funkciju propagacije unazad koristeći gradijentni spust.
Isporukom ažuriranja kada se izlazi ne podudaraju s odgovarajućim oznakama, ova funkcija omogućava neuronskoj mreži da „uči“.
Konačno, postavili smo naš potpuno novi Python neuronska mreža na test koristeći MNIST skup podataka. Sve je funkcionisalo glatko.
Sretno kodiranje!
Ostavite odgovor