Table of Contents[Ferstopje][Toanje]
It brein is te fergelykjen mei neurale netwurken. Dit is de analogy dy't typysk wurdt brûkt om immen nij te helpen by it ûnderwerp om de ideeën efter masine learen en keunstmjittige neurale netwurken te begripen.
Om't efter de skermen ferskate lagen fan wiskundige en statistyske berekkeningen binne, is it definiearjen fan dizze netwurken as in wiskundige funksje in mear avansearre metoade.
Dit is foar de minsken dy't eins ynteressearre binne yn masine learen en wolle sjen hoe't Python neurale netwurkkoade skreaun is.
Yn dit artikel sille wy demonstrearje hoe't jo in folslein ferbûn Deep Neural Network (DNN) fanôf it begjin kinne konstruearje Python 3.
In oersjoch fan 'e triemstruktuer foar ús Python Neural Network Code
Hjir sille trije triemmen makke wurde. De earste is it ienfâldige nn.py-bestân, dat sil wurde besprutsen yn "Helperfunksjes ynstelle" en "It neurale netwurk fanôf it bouwen bouwe."
Wy sille ek in bestân hawwe mei de namme mnist loader.py om de testgegevens te laden, lykas beskreaun yn "MNIST-gegevens laden."
Uteinlik sille wy in bestân hawwe mei de namme test.py dat sil wurde lansearre yn 'e terminal om ús neurale netwurk te testen.
Dit bestân wurdt yn detail beskreaun yn "Running Tests."
Ynstallaasje
De NumPy Python-bibleteek moat wurde ynladen om dizze tutorial te folgjen. Jo kinne dit berikke troch it folgjende kommando te brûken op 'e terminal:
Modules ymportearje en de Helperfunksje ynstelle
De ienige twa bibleteken dy't wy nedich binne willekeurich en NumPy, dy't wy sille ymportearje direkt. Foar de earste gewichten fan ús neuronale netwurk sille wy se skodzje mei de willekeurige bibleteek.
Om ús berekkeningen te fersnellen, sille wy NumPy of np brûke (troch konvinsje wurdt it faak ymportearre as np). Us twa helperfunksjes sille wurde makke nei ús ymport. Twa sigmoid funksjes: ien en sigmoid prime.
Logistyske regression sil gegevens klassifisearje mei de sigmoid-funksje, wylst backpropagation de delta of gradient sil berekkenje mei de sigmoid-primefunksje.
Netwurkklasse oanmeitsje
It bouwen fan in folslein keppele neural netwurk is de ienige fokus fan dizze seksje. De netwurkklasse sil alle funksjes omfetsje dy't dêrnei komme. De funksje Object() { [native code] } sil yn earste ynstânsje makke wurde yn ús netwurkklasse.
Ien argumint, maten, is fereaske troch de funksje Object () { [native code] }. De fariabele grutte is in samling numerike wearden dy't it oantal ynfierknooppunten fertsjintwurdiget oanwêzich yn elke laach fan ús neurale netwurk.
Wy inisjalisearje fjouwer eigenskippen yn ús __init__ metoade. De ynfierfariabelen, maten, wurde brûkt om respektivelik de list mei laachgrutte en it oantal lagen, num lagen, yn te stellen.
De earste stap is om de earste foaroardielen fan ús netwurk willekeurich ta te jaan oan elke laach dy't de ynfierlaach folget.
Uteinlik hat elke keppeling tusken de ynfier- en útfierlagen syn gewichten willekeurich oanmakke. Np.Random.Randn () jout in willekeurige stekproef lutsen út de normale ferdieling foar kontekst.
Feed Forward Funksje
Yn in neuraal netwurk wurdt ynformaasje troch de feedforwardfunksje trochstjoerd. Ien argumint, a, dy't de hjoeddeistige aktivearringsvektor oanjout, sil ferplicht wurde troch dizze funksje.
Dizze funksje skatte de aktivearrings by elke laach troch iterearjen oer alle foaroardielen en gewichten yn it netwurk. It antwurd jûn is de foarsizzing, dat is de aktivearrings fan de lêste laach.
Mini-batch Gradient Descent
It wurkhynder fan ús Netwurkklasse is Gradient Descent. Yn dizze ferzje brûke wy mini-batch (stochastyske) gradient ôfstamming, in wizige fariaasje fan gradient ôfstamming.
Dit jout oan dat in lytse partij gegevenspunten sil wurde brûkt om ús model te aktualisearjen. Fjouwer fereaske en ien opsjoneel argumint wurde trochjûn oan dizze metoade. De fjouwer fereaske fariabelen binne de trainingsgegevensset, it oantal epoken, de grutte fan 'e mini-batches, en de learsnelheid (eta).
Testgegevens binne beskikber op oanfraach. Wy sille testgegevens leverje as wy dit netwurk úteinlik evaluearje. It oantal samples yn dizze funksje wurdt yn earste ynstânsje ynsteld op de lingte fan de list as de trainingsgegevens binne omfoarme ta in listtype.
Wy tapasse ek itselde proses foar it testen fan gegevens dy't ynjûn wurde. Dit komt om't ynstee fan ús as listen werom te jaan, se echt zips fan listen binne. As wy letter de MNIST-gegevensmonsters laden, sille wy hjir mear oer leare.
As wy derfoar soargje kinne dat wy beide soarten gegevens as listen leverje, dan is dizze type-casting net needsaaklik essensjeel.
Sadree't wy hawwe de gegevens, wy gean oer de oplieding tiidrekken yn in lus. In trainingsperioade is mar ien ronde fan training foar neuronale netwurken. Wy skodzje earst de gegevens yn elke epoch om willekeurich te garandearjen foardat wy in list mei mini-batches meitsje.
De update mini-batchfunksje, dy't hjirûnder wurdt besprutsen, sil wurde neamd foar elke mini-batch. De testkreakens sil ek weromjûn wurde as de testgegevens beskikber binne.
Kosten-derivative helperfunksje
Litte wy earst in helperfunksje ûntwikkelje neamd kostenderivative foardat wy de backpropagation-koade wirklik meitsje. As wy in flater meitsje yn ús útfierlaach, sil de kostenderivative funksje it sjen litte.
It fereasket twa yngongen: de útfier aktivearring array en de y-koördinaten fan de ferwachte útfier wearden.
Backpropagation funksje
Us hjoeddeistige aktivearringsvektor, aktivearring, lykas alle oare aktivearringsvektoren, aktivearrings, en z-vektors, zs, moatte allegear yn gedachten wurde hâlden. In laach neamd de ynfierlaach wurdt earst aktivearre.
Wy sille elke foaroardielen en gewicht trochrinne nei it opsetten. Elke lus omfettet it berekkenjen fan de z-fektor as it puntprodukt fan 'e gewichten en de aktivearring, it tafoegjen oan' e list fan zs, it opnij berekkenjen fan 'e aktivearring en it tafoegjen fan' e aktualisearre aktivearring oan 'e list mei aktivearrings.
As lêste, de wiskunde. De delta, dy't gelyk is oan de flater fan 'e foarige laach fermannichfâldige mei de sigmoid prime fan it lêste elemint fan de zs vectoren, wurdt berekkene foardat wy begjinne ús efterút pass.
De lêste laach fan nabla b is ynsteld om de delta te wêzen, en de lêste laach fan nabla w is ynsteld om it puntprodukt fan 'e delta te wêzen en de op ien nei lêste laach fan aktivearrings (transponearre sadat wy de wiskunde kinne dwaan) .
Wy geane troch as earder, begjinnend mei de twadde laach en einigje mei de lêste, en werhelje it proses nei it foltôgjen fan dizze lêste lagen. De nablas wurde dan weromjûn as in tupel.
Bywurkjen fan Mini-batch gradient ôfstamming
Us SGD (stochastic gradient descent) metoade fan earder omfettet mini-batch bywurking. Sûnt it wurdt brûkt yn SGD, mar ek fereasket backprop, Ik debattearre wêr't te pleatsen dizze funksje.
Uteinlik haw ik de kar makke om it hjir te pleatsen. It begjint mei it generearjen fan 0-fektors fan 'e foaroardielen en gewichten' nablas, krekt lykas ús backpropfunksje die.
It fereasket de mini-batch en it eta-learrate as syn twa ynputs. Yn 'e mini-batch brûke wy dan de backprop-funksje om de delta fan elke nabla-array te krijen foar elke ynfier, x, en útfier, y. De nabla-listen wurde dan bywurke mei dizze delta's.
Uteinlik brûke wy it leartempo en de nablas om de gewichten en foaroardielen fan it netwurk te aktualisearjen. Eltse wearde wurdt bywurke nei de meast resinte wearde, minder it learen taryf, fermannichfâldige mei de minibatch grutte, en dan tafoege oan de nabla wearde.
Evaluearje funksje
De evaluearje funksje is de lêste dy't wy moatte skriuwe. De testgegevens binne de ienige ynfier foar dizze funksje. Yn dizze funksje fergelykje wy allinich de útgongen fan it netwurk mei it ferwachte resultaat, y. Troch feeding de ynfier, x, foarút, de útgongen fan it netwurk wurde bepaald.
Folsleine koade
As wy kombinearje alle koade, dit is hoe't it ferskynt.
Testen fan neural netwurk
It laden fan MNIST-gegevens
De Ynformaasje oer it bedriuw MNIST is yn .pkl.gz-formaat, dat wy sille iepenje mei GZIP en laden mei pickle. Litte wy in rappe metoade skriuwe om dizze gegevens te laden as in tuple fan grutte trije, ferdield yn training-, falidaasje- en testgegevens.
Om ús gegevens makliker te behearjen, sille wy in oare funksje skriuwe om de y te kodearjen yn in array fan 10 items. De array sil alle 0's wêze, útsein in 1 dy't oerienkomt mei it juste sifer fan 'e ôfbylding.
Wy sille de basis laden gegevens en ien hot kodearring metoade brûke om ús gegevens te laden yn in lêsber formaat. In oare funksje sil wurde skreaun dy't ús x-wearden sil konvertearje yn in list fan grutte 784, oerienkomt mei de 784 piksels fan 'e ôfbylding, en ús y-wearden yn har single hot kodearre fektorfoarm.
Dan kombinearje wy de x- en y-wearden sadat de iene yndeks oerienkomt mei de oare. Dit jildt foar de gegevenssets fan training, falidaasje en test. Wy jouwe dan de feroare gegevens werom.
Running Tests
Wy sille in nij bestân meitsje mei de namme "mnist loader" dy't sawol it neurale netwurk sil ymportearje dat wy earder fêststeld hawwe (ienfâldige nn) as de MNIST-gegevenssetlader foardat wy begjinne te testen.
Yn dit bestân hoege wy allinich de gegevens te ymportearjen, in netwurk te bouwen mei in ynfierlaachgrutte fan 784 en in útfierlaachgrutte fan 10, de SGD-funksje fan it netwurk út te fieren op 'e trainingsgegevens, en testje it dan mei de testgegevens.
Hâld der rekken mei dat foar ús list fan ynfier lagen, it makket gjin ferskil wat ien fan de nûmers binne tusken 784 en 10. Wy kinne feroarje de oare lagen lykas wy wolle; krekt de ynfier- en útfiergrutte binne fêst.
Trije lagen binne net nedich; wy kinne fjouwer, fiif, of sels mar twa brûke. Have fun eksperimintearjen mei it.
Konklúzje
Hjir, mei Python 3, meitsje wy in neural netwurk fanôf it begjin. Tegearre mei wiskunde op heech nivo hawwe wy ek de spesifikaasjes fan ymplemintaasje besprutsen.
Wy begûnen mei it ymplementearjen fan helperfunksjes. Foar de neuroanen om te wurkjen, binne de sigmoid- en sigmoid-primefunksjes krúsjaal. Wy sette dan de feedforward-funksje yn 'e praktyk, dat is it fûnemintele proses foar it fieden fan gegevens yn it neurale netwurk.
Dêrnei makken wy de gradient-ôfstammingsfunksje yn Python, de motor dy't ús neurale netwurk driuwt. Om "lokale minima" te lokalisearjen en har gewichten en foaroardielen te optimalisearjen, brûkt ús neurale netwurk gradientôfstamming. Wy makken de backpropagation funksje mei help fan gradient ôfstamming.
Troch updates te leverjen as de útgongen net oerienkomme mei de juste labels, stelt dizze funksje it neuronale netwurk yn steat om te "learen."
Uteinlik sette wy ús gloednije Python neuronale netwurk nei de test mei de MNIST-gegevensset. Alles fungearre soepel.
Lokkige kodearring!
Leave a Reply