Cuprins[Ascunde][Spectacol]
Creierul este comparabil cu rețelele neuronale. Aceasta este analogia care este de obicei folosită pentru a ajuta pe cineva nou la subiect să înțeleagă ideile din spatele învățării automate și a rețelelor neuronale artificiale.
Deoarece există mai multe straturi de calcule matematice și statistice care se desfășoară în culise, definirea acestor rețele ca o funcție matematică este o metodă mai avansată.
Acesta este pentru oamenii care sunt de fapt interesați de învățarea automată și doresc să vadă cum este scris codul de rețea neuronală Python.
În acest articol, vom demonstra cum să construim o rețea neuronală profundă (DNN) complet conectată de la zero. Piton 3.
O prezentare generală a structurii fișierelor pentru codul nostru de rețea neuronală Python
Vor fi trei fișiere create aici. Primul este fișierul simplu nn.py, care va fi discutat în „Configurarea funcțiilor de ajutor” și „Construirea rețelei neuronale de la zero”.
Vom avea, de asemenea, un fișier numit mnist loader.py pentru a încărca datele de testare, așa cum este descris în „Încărcarea datelor MNIST”.
În cele din urmă, vom avea un fișier numit test.py care va fi lansat în terminal pentru a ne testa rețeaua neuronală.
Acest fișier este descris în detaliu în „Teste de rulare”.
Instalare
Biblioteca NumPy Python trebuie descărcată pentru a urma acest tutorial. Puteți realiza acest lucru folosind următoarea comandă pe terminal:
Importarea modulelor și configurarea funcției Helper
Singurele două biblioteci de care avem nevoie sunt aleatorii și NumPy, pe care le vom importa imediat. Pentru greutățile inițiale ale rețelei noastre neuronale, le vom amesteca folosind biblioteca aleatoare.
Pentru a ne accelera calculele, vom folosi NumPy sau np (prin convenție, este adesea importat ca np). Cele două funcții de ajutor vor fi realizate după importurile noastre. Două funcții sigmoid: una și sigmoid prim.
Regresia logistică va clasifica datele folosind funcția sigmoid, în timp ce backpropagation va calcula delta sau gradientul folosind funcția sigmoid prim.
Crearea clasei de rețea
Construirea unei rețele neuronale complet conectate este singurul obiectiv al acestei secțiuni. Clasa de rețea va cuprinde toate funcțiile care urmează. Funcția Object() { [cod nativ] } va fi creată inițial în clasa noastră de rețea.
Un argument, dimensiuni, este cerut de funcția Object() { [cod nativ] }. Variabila dimensiuni este o colecție de valori numerice care reprezintă numărul de noduri de intrare prezente în fiecare strat al rețelei noastre neuronale.
Inițializam patru proprietăți în metoda noastră __init__. Variabilele de intrare, sizes, sunt folosite pentru a seta lista de dimensiuni ale straturilor și, respectiv, numărul de straturi, num layers.
Primul pas este să atribuim aleatoriu prejudecățile inițiale ale rețelei noastre fiecărui strat care urmează stratul de intrare.
În cele din urmă, fiecare legătură dintre straturile de intrare și de ieșire are ponderile sale generate aleatoriu. Np.Random.Randn() oferă un eșantion aleatoriu extras din distribuția normală pentru context.
Funcția Feed Forward
Într-o rețea neuronală, informațiile sunt transmise înainte de funcția de feedforward. Un argument, a, care indică vectorul de activare curent, va fi solicitat de această funcție.
Această funcție estimează activările la fiecare strat prin iterarea tuturor prejudecăților și ponderilor din rețea. Răspunsul dat este predicția, care este activările ultimului strat.
Coborâre gradient mini-lot
Calul de bătaie al clasei noastre Network este Gradient Descent. În această versiune, folosim coborâre în gradient mini-batch (stochastică), o variație modificată a coborârii gradientului.
Acest lucru indică faptul că un lot mic de puncte de date va fi utilizat pentru a actualiza modelul nostru. Patru argumente obligatorii și unul opțional sunt transmise acestei metode. Cele patru variabile necesare sunt setul de date de antrenament, numărul de epoci, dimensiunea mini-loturi și rata de învățare (eta).
Datele de testare sunt disponibile la cerere. Vom furniza date de testare când vom evalua în cele din urmă această rețea. Numărul de mostre din această funcție este setat inițial la lungimea listei odată ce datele de antrenament au fost transformate într-un tip de listă.
De asemenea, aplicăm același proces pentru a testa datele care sunt furnizate. Acest lucru se datorează faptului că, în loc să ne fie returnate sub formă de liste, acestea sunt într-adevăr niște liste. Când încărcăm mostrele de date MNIST mai târziu, vom afla mai multe despre asta.
Dacă ne putem asigura că furnizăm ambele tipuri de date ca liste, atunci această distribuție de tip nu este neapărat esențială.
Odată ce avem datele, trecem peste epocile de antrenament într-o buclă. O perioadă de antrenament este doar o rundă de pregătire a rețelei neuronale. Mai întâi amestecăm datele în fiecare epocă pentru a ne asigura aleatoriu înainte de a face o listă de mini-loturi.
Funcția de actualizare mini-lot, care este discutată mai jos, va fi apelată pentru fiecare mini-lot. Precizia testului va fi returnată și dacă datele testului sunt disponibile.
Funcția de ajutor derivată din costuri
Să dezvoltăm mai întâi o funcție de ajutor numită cost derivat înainte de a crea cu adevărat codul de backpropagation. Dacă facem o greșeală în stratul nostru de ieșire, funcția derivată de cost o va arăta.
Necesită două intrări: tabloul de activări de ieșire și coordonatele y ale valorilor de ieșire anticipate.
Funcția de retropropagare
Vectorul nostru de activare actual, activarea, precum și orice alți vectori de activare, activări și vectori z, zs, trebuie să fie reținut. Mai întâi este activat un strat numit strat de intrare.
Vom parcurge fiecare părtinire și greutate după ce le-am pus. Fiecare buclă implică calcularea vectorului z ca produs punctual al greutăților și activării, adăugarea acestuia la lista de zs, recalcularea activării și adăugarea activării actualizate la lista de activări.
În sfârșit, matematica. Delta, care este egală cu eroarea din stratul anterior înmulțită cu primul sigmoid al ultimului element al vectorilor zs, este calculată înainte de a începe trecerea înapoi.
Ultimul strat al nabla b este setat să fie delta, iar stratul final al nabla w este setat să fie produsul punctual al deltei și al doilea până ultimul strat de activări (transpus astfel încât să putem face efectiv calculele) .
Procedăm ca mai înainte, începând cu al doilea strat și terminând cu ultimul, și repetă procesul după finalizarea acestor ultime straturi. Nablas sunt apoi returnate ca un tuplu.
Se actualizează coborârea gradientului mini-loc
Metoda noastră SGD (coborâre a gradientului stocastic) de mai înainte încorporează actualizarea mini-loturi. Deoarece este utilizat în SGD, dar necesită și backprop, am dezbătut unde să pun această funcție.
În cele din urmă, am ales să-l postez aici. Începe prin a genera 0 vectori ai nablas-urilor biaselor și ponderilor, la fel cum a făcut funcția noastră backprop.
Necesită mini-lotul și rata de învățare eta ca două intrări. În mini-lot, folosim apoi funcția backprop pentru a obține delta fiecărei matrice nabla pentru fiecare intrare, x și ieșire, y. Listele nabla sunt apoi actualizate cu aceste delte.
În cele din urmă, folosim rata de învățare și nablas pentru a actualiza ponderile și părtinirile rețelei. Fiecare valoare este actualizată la cea mai recentă valoare, mai puțin rata de învățare, înmulțită cu dimensiunea mini-lot și apoi adăugată la valoarea nabla.
Evaluați funcția
Funcția de evaluare este cea finală pe care trebuie să o scriem. Datele de testare sunt singura intrare pentru această funcție. În această funcție, comparăm doar ieșirile rețelei cu rezultatul anticipat, y. Prin alimentarea intrării, x, înainte, se determină ieșirile rețelei.
Cod complet
Când combinăm tot codul, așa apare.
Testarea rețelei neuronale
Se încarcă datele MNIST
date MNIST este în format .pkl.gz, pe care îl vom deschide folosind GZIP și îl vom încărca cu pickle. Să scriem o metodă rapidă pentru a încărca aceste date ca un tuplu de dimensiunea trei, împărțit în date de antrenament, validare și testare.
Pentru a face datele noastre mai ușor de gestionat, vom scrie o altă funcție pentru a codifica y într-o matrice de 10 elemente. Matricea va fi toate 0, cu excepția unui 1 care se potrivește cu cifra corectă a imaginii.
Vom folosi datele de încărcare de bază și o metodă de codificare la cald pentru a ne încărca datele într-un format care poate fi citit. O altă funcție va fi scrisă care va converti valorile noastre x într-o listă de dimensiunea 784, care se potrivește cu cei 784 de pixeli ai imaginii, iar valorile noastre y în forma lor unică de vector codificat la cald.
Apoi vom combina valorile x și y astfel încât un index să se potrivească cu celălalt. Acest lucru este valabil pentru seturile de date de instruire, validare și testare. Apoi returnăm datele modificate.
Teste de alergare
Vom crea un nou fișier numit „mnist loader” care va importa atât rețeaua neuronală pe care am stabilit-o anterior (nn simplu), cât și încărcătorul setului de date MNIST înainte de a începe testarea.
În acest fișier, tot ce trebuie să facem este să importam datele, să construim o rețea cu o dimensiune a stratului de intrare de 784 și o dimensiune a stratului de ieșire de 10, să rulăm funcția SGD a rețelei pe datele de antrenament, apoi să o testăm folosind datele de testare.
Rețineți că, pentru lista noastră de straturi de intrare, nu are nicio diferență care sunt numerele între 784 și 10. Putem schimba celelalte straturi cum ne place; doar dimensiunile de intrare și de ieșire sunt fixe.
Nu sunt necesare trei straturi; am putea folosi patru, cinci sau chiar doar două. Distrează-te experimentând cu el.
Concluzie
Aici, folosind Python 3, creăm o rețea neuronală de la zero. Alături de matematica de nivel înalt, am discutat și despre specificul implementării.
Am început prin a implementa funcții de ajutor. Pentru ca neuronii să funcționeze, funcțiile sigmoid și sigmoid prim sunt cruciale. Apoi punem în practică funcția feedforward, care este procesul fundamental pentru alimentarea datelor în rețeaua neuronală.
Apoi, am creat funcția de coborâre a gradientului în Python, motorul care conduce rețeaua noastră neuronală. Pentru a localiza „minimele locale” și pentru a le optimiza ponderile și părtinirile, rețeaua noastră neuronală folosește coborârea în gradient. Am creat funcția de backpropagation folosind coborâre în gradient.
Prin furnizarea de actualizări atunci când ieșirile nu se potrivesc cu etichetele corespunzătoare, această funcție permite rețelei neuronale să „învețe”.
În cele din urmă, am pus noul nostru Python rețele neuronale la test folosind setul de date MNIST. Totul a funcționat fără probleme.
Codificare fericită!
Lasă un comentariu