Inhaltsverzeechnes[Verstoppen][Show]
De Gehir ass vergläichbar mat neurale Netzwierker. Dëst ass d'Analogie déi typesch benotzt gëtt fir een neien zum Thema ze hëllefen d'Iddien hannert Maschinnléieren a kënschtlech neural Netzwierker ze verstoen.
Well et e puer Schichten vu mathemateschen a statistesche Berechnungen hannert de Kulisse lafen, ass dës Netzwierker als mathematesch Funktioun ze definéieren eng méi fortgeschratt Method.
Dëst ass fir d'Leit déi tatsächlech un Maschinnléiere interesséiert sinn a wëllen kucken wéi Python neural Netzwierkcode geschriwwe gëtt.
An dësem Artikel wäerte mir demonstréieren wéi een e komplett verbonne Deep Neural Network (DNN) vun Null konstruéiert Python 3.
En Iwwerbléck iwwer d'Dateistruktur fir eise Python Neural Network Code
Et ginn dräi Dateien hei erstallt. Déi éischt ass déi einfach nn.py Datei, déi an "Hëlleffunktiounen opbauen" an "Den Neuralnetz vun Null opbauen" diskutéiert gëtt.
Mir wäerten och e Fichier mam Numm mnist loader.py hunn fir d'Testdaten ze lueden, wéi beschriwwen an "MNIST Data lueden."
Schlussendlech hu mir eng Datei mam Numm test.py deen am Terminal lancéiert gëtt fir eisen neurale Netzwierk ze testen.
Dës Datei gëtt am Detail am "Running Tests" beschriwwen.
Installatioun
D'NumPy Python Bibliothéik muss erofgeluede ginn fir dësen Tutorial ze verfollegen. Dir kënnt dëst erreechen andeems Dir de folgende Kommando um Terminal benotzt:
Moduler importéieren an d'Helperfunktioun opsetzen
Déi eenzeg zwou Bibliothéiken déi mir brauchen sinn zoufälleg an NumPy, déi mir direkt importéieren. Fir déi initial Gewiichter vun eisem neurale Netzwierk, shuffle mir se mat der zoufälleger Bibliothéik.
Fir eis Berechnungen ze beschleunegen, benotze mir NumPy oder np (vun der Konventioun gëtt et dacks als np importéiert). Eis zwou Hëllefsfunktiounen ginn no eisen Importer gemaach. Zwee Sigmoid Funktiounen: eent a Sigmoid Prime.
Logistesch Regressioun wäert Daten klassifizéieren mat der Sigmoid Funktioun, wärend Backpropagation den Delta oder Gradient berechent mat der Sigmoid Prime Funktioun.
Schafen Network Class
E komplett verbonne neuralt Netzwierk bauen ass deen eenzege Fokus vun dëser Sektioun. D'Netzwierkklass enthält all d'Funktiounen déi duerno kommen. D'Funktioun Object () { [native code] } gëtt ufanks an eiser Netzwierkklass erstallt.
Een Argument, Gréissten, ass erfuerderlech vun der Funktioun Object() { [native code] }. D'Gréisst Variabel ass eng Sammlung vun numeresche Wäerter déi d'Zuel vun den Inputnoden duerstellt, déi an all Schicht vun eisem neurale Netzwierk present sinn.
Mir initialiséieren véier Eegeschaften an eiser __init__ Method. D'Input Variablen, Gréissten, gi benotzt fir d'Lëscht vun de Schichtgréissten an d'Zuel vun de Schichten, num Schichten, respektiv ze setzen.
Den éischte Schrëtt ass zoufälleg déi initial Biases vun eisem Netzwierk un all Layer ze ginn, déi der Inputschicht follegt.
Schlussendlech huet all Link tëscht den Input- an Ausgangsschichten seng Gewiichter zoufälleg generéiert. Np.Random.Randn () gëtt eng zoufälleg Echantillon aus der normal Verdeelung fir Kontext.
Feed Forward Funktioun
An engem neurale Netzwierk gëtt Informatioun duerch d'Feedforward Funktioun geschéckt. Een Argument, a, deen den aktuellen Aktivéierungsvektor ugeet, gëtt vun dëser Funktioun erfuerderlech.
Dës Funktioun schätzt d'Aktivatioune bei all Layer andeems se iwwer all Biases a Gewiichter am Netz iteréieren. D'Äntwert ass d'Prognose, dat ass d'Aktivatioune vun der leschter Schicht.
Mini-Batch Gradient Descent
Eis Network Klass Aarbechtshorse ass Gradient Descent. An dëser Versioun benotze mir Mini-Batch (stochastesch) Gradient Ofstamung, eng modifizéiert Variatioun vum Gradient Ofstamung.
Dëst weist datt eng kleng Partie vun Datepunkte benotzt gi fir eise Modell ze aktualiséieren. Véier erfuerderlech an een fakultativ Argument ginn op dës Method weiderginn. Déi véier erfuerderlech Variablen sinn den Trainingsdatenset, d'Zuel vun den Epochen, d'Gréisst vun de Mini-Batches, an de Léierrate (eta).
Testdaten sinn op Ufro verfügbar. Mir liwweren Testdaten wa mir dëst Netzwierk schlussendlech evaluéieren. D'Zuel vun de Proben an dëser Funktioun ass am Ufank op d'Längt vun der Lëscht festgeluegt wann d'Trainingsdaten an eng Lëschttyp transforméiert goufen.
Mir applizéieren och de selwechte Prozess fir Daten ze testen, déi an. Wa mir d'MNIST Dateproben méi spéit lueden, léiere mir méi iwwer dëst.
Wa mir sécher kënne stellen datt mir béid Aarte vun Daten als Lëschte ubidden, dann ass dësen Typcasting net onbedéngt wesentlech.
Wann mir d'Donnéeën hunn, gi mir iwwer d'Trainingsepochen an enger Loop. Eng Trainingsperiod ass nëmmen eng Ronn vun neuralen Netzwierk Training. Mir shuffle fir d'éischt d'Donnéeën an all Epoch fir Zoufall ze garantéieren ier Dir eng Lëscht vu Mini-Batches mécht.
D'Aktualiséierung Mini Batch Funktioun, déi hei drënner diskutéiert gëtt, gëtt fir all Mini-Batch genannt. D'Testgenauegkeet gëtt och zréckginn wann d'Testdaten verfügbar sinn.
Käschte-derivativ Hëllefsfunktioun
Loosst eis eng Helperfunktioun entwéckelen, genannt Käschtenderivativ fir d'éischt ier mir wierklech de Backpropagation Code erstellen. Wa mir e Feeler an eiser Ausgangsschicht maachen, wäert d'Käschte-Derivatfunktioun et weisen.
Et erfuerdert zwee Inputen: d'Ausgangsaktivéierungsarray an d'y-Koordinate vun den erwaarten Ausgangswäerter.
Backpropagation Funktioun
Eis aktuell Aktivéierungsvektor, Aktivéierung, souwéi all aner Aktivéierungsvektoren, Aktivatiounen, an z-Vektoren, zs, mussen all am Kapp behalen ginn. Eng Layer genannt Input Layer gëtt als éischt aktivéiert.
Mir schloen duerch all Viraussetzung a Gewiicht nodeems se se opgesat hunn. All Loop beinhalt d'Berechnung vum z Vektor als Punktprodukt vun de Gewiichter an der Aktivatioun, addéiere se an d'Lëscht vun zs, d'Aktivatioun nei berechnen an d'aktualiséiert Aktivéierung op d'Lëscht vun den Aktivéierungen derbäi.
Endlech, Mathematik. Den Delta, deen gläich ass mam Feeler vun der viregter Schicht multiplizéiert mam Sigmoid-Prime vum leschten Element vun den zs-Vektoren, gëtt berechent ier mer eise Réckpass starten.
Déi lescht Schicht vun nabla b ass gesat fir den Delta ze sinn, an déi lescht Schicht vun nabla w ass gesat fir d'Punktprodukt vum Delta an déi zweet bis lescht Schicht vun Aktivatiounen ze sinn (transposéiert sou datt mir d'Mathematik maache kënnen) .
Mir fuere wéi virdrun, mat der zweeter Schicht unzefänken a mat der leschter ofschléissend, a widderhuelen de Prozess nodeems Dir dës lescht Schichten ofgeschloss hutt. D'Nablas ginn dann als Tupel zréckginn.
Update Mini-Batch Gradient Ofstamung
Eis SGD (stochastic Gradient Descent) Method vu virdru integréiert Mini-Batch Update. Well et am SGD benotzt gëtt awer och Backprop erfuerdert, hunn ech diskutéiert wou ech dës Funktioun setzen.
Endlech hunn ech de Choix gemaach et hei ze posten. Et fänkt un andeems 0 Vecteure vun de Biases 'a Gewiichter' Nablas generéiert, grad wéi eis Backprop Funktioun.
Et erfuerdert de Mini-Batch an den eta Léierrate als seng zwee Inputen. Am Mini-Batch benotze mir dann d'Backprop-Funktioun fir den Delta vun all Nabla-Array fir all Input, x, an Output, y ze kréien. D'Nabla Lëschte ginn dann mat dësen Deltas aktualiséiert.
Schlussendlech benotze mir d'Léierrate an d'Nablas fir d'Gewichte a Biases vum Netzwierk ze aktualiséieren. All Wäert gëtt op de leschte Wäert aktualiséiert, manner de Léierrate, multiplizéiert mat der Minibatchgréisst, an dann zum Nabla-Wäert bäigefüügt.
Bewäert Funktioun
D'Evaluatiounsfunktioun ass déi lescht déi mir musse schreiwen. D'Testdaten sinn déi eenzeg Input fir dës Funktioun. An dëser Funktioun vergläiche mir nëmmen d'Ausgänge vum Netz mam erwaarten Resultat, y. Andeems Dir den Input fiddert, x, no vir, ginn d'Ausgänge vum Netz bestëmmt.
Komplett Code
Wa mir all de Code kombinéieren, ass dat wéi et schéngt.
Testen Neural Network
Lueden MNIST Daten
d' MNIST Daten ass am .pkl.gz Format, wat mir mat GZIP opmaachen a mat Pickle lueden. Loosst eis eng séier Method schreiwen fir dës Donnéeën als Tupel vun der Gréisst dräi ze lueden, opgedeelt an Training, Validatioun an Testdaten.
Fir eis Daten méi einfach ze verwalten, schreiwen mir eng aner Funktioun fir den y an eng 10-Elementarray ze codéieren. D'Array wäert all 0s sinn, ausser fir eng 1 déi mat der richteger Ziffer vum Bild entsprécht.
Mir benotzen d'Basis Lueddaten an eng waarm Kodéierungsmethod fir eis Daten an e liesbare Format ze lueden. Eng aner Funktioun gëtt geschriwwe ginn, déi eis x Wäerter an eng Lëscht vun der Gréisst 784 konvertéieren, passend mat de 784 Pixelen vum Bild, an eis y Wäerter an hir eenzeg waarm kodéiert Vektorform.
Da kombinéiere mir d'x an y Wäerter sou datt een Index mat deem aneren entsprécht. Dëst gëllt fir d'Ausbildung, d'Validatioun an d'Testdatesets. Mir ginn dann déi geännert Donnéeën zréck.
Lafen Tester
Mir maachen eng nei Datei mam Numm "mnist loader" deen souwuel dat neuralt Netzwierk importéiert dat mir virdru gegrënnt hunn (einfach nn) an den MNIST Dateset Loader ier mir ufänken ze testen.
An dëser Datei brauche mir nëmmen d'Donnéeën z'importéieren, en Netzwierk mat enger Input Layer Gréisst vun 784 an enger Output Layer Gréisst vun 10 ze bauen, d'Netzwierk SGD Funktioun op den Trainingsdaten auszeféieren, dann testen se mat den Testdaten.
Halen vergiessen, datt fir eis Lëscht vun Input Schichten, et mécht keen Ënnerscheed wat eng vun den Zuelen sinn tëscht 784 an 10. Mir kënnen déi aner Schichten all Manéier änneren mir gären; just d'Input an d'Ausgabgréisste si fixéiert.
Dräi Schichten sinn net néideg; mir benotze vläicht véier, fënnef oder souguer nëmmen zwee. Vill Spaass domat ze experimentéieren.
Konklusioun
Hei, mat Python 3, kreéiere mir en neuralt Netzwierk vun Null. Zesumme mat héijer Mathematik hu mir och d'Spezifizitéite vun der Implementatioun diskutéiert.
Mir hunn ugefaang mat Hëllefsfunktiounen ëmzesetzen. Fir d'Neuronen ze schaffen, sinn d'Sigmoid a Sigmoid Haaptfunktiounen entscheedend. Mir setzen dann d'Feedforward Funktioun an d'Praxis, wat de fundamentale Prozess ass fir Daten an dat neuralt Netzwierk ze fidderen.
Als nächst hu mir d'Gradient Ofstamungsfunktioun am Python erstallt, de Motor deen eisen neurale Netzwierk dréit. Fir "lokal Minima" ze lokaliséieren an hir Gewiichter a Biases ze optimiséieren, benotzt eisen neurale Netzwierk Gradient Ofstamung. Mir hunn d'Réckpropagatiounsfunktioun erstallt mat gradient Ofstamung.
Andeems Dir Updates liwwert wann d'Ausgaben net mat de passenden Etiketten entspriechen, erméiglecht dës Funktioun dem neurale Netzwierk ze "léieren."
Endlech hu mir eise fuschneie Python gesat neural Netz op den Test mat der MNIST Dateset. Alles funktionéiert glat.
Happy Kodéierung!
Hannerlooss eng Äntwert