INHOUDSOPGAWE[Versteek][Wys]
Die brein is vergelykbaar met neurale netwerke. Dit is die analogie wat tipies gebruik word om iemand nuut in die vak te help om die idees agter masjienleer en kunsmatige neurale netwerke te verstaan.
Omdat daar verskeie lae wiskundige en statistiese berekeninge agter die skerms aan die gang is, is dit 'n meer gevorderde metode om hierdie netwerke as 'n wiskundige funksie te definieer.
Dit is vir die mense wat eintlik in masjienleer belangstel en wil sien hoe Python se neurale netwerkkode geskryf word.
In hierdie artikel sal ons demonstreer hoe om 'n volledig gekoppelde diep neurale netwerk (DNN) van nuuts af te bou Python 3.
'n Oorsig van die lêerstruktuur vir ons Python-neurale netwerkkode
Daar sal drie lêers hier geskep word. Die eerste is die eenvoudige nn.py-lêer, wat bespreek sal word in "Opstel van helperfunksies" en "Bou die neurale netwerk van nuuts af."
Ons sal ook 'n lêer met die naam mnist loader.py hê om die toetsdata te laai, soos beskryf in "Laai MNIST-data."
Ten slotte sal ons 'n lêer met die naam test.py hê wat in die terminale bekendgestel sal word om ons neurale netwerk te toets.
Hierdie lêer word in detail beskryf in "Lopende toetse."
installasie
Die NumPy Python-biblioteek moet afgelaai word om hierdie tutoriaal te volg. U kan dit bereik deur die volgende opdrag op die terminale te gebruik:
Die invoer van modules en die opstel van die Helper-funksie
Die enigste twee biblioteke wat ons benodig, is ewekansig en NumPy, wat ons dadelik sal invoer. Vir ons neurale netwerk se aanvanklike gewigte, sal ons dit skommel deur die ewekansige biblioteek te gebruik.
Om ons berekeninge te bespoedig, sal ons NumPy of np gebruik (volgens konvensie word dit dikwels as np ingevoer). Ons twee helper funksies sal gemaak word na ons invoere. Twee sigmoïde funksies: een en sigmoïed prime.
Logistiese regressie sal data klassifiseer deur gebruik te maak van die sigmoïed funksie, terwyl terugpropagasie die delta of gradiënt sal bereken deur die sigmoïed prime funksie te gebruik.
Skep netwerkklas
Die bou van 'n ten volle gekoppelde neurale netwerk is die enigste fokus van hierdie afdeling. Die netwerkklas sal al die funksies wat daarna kom insluit. Die funksie Object() { [inheemse kode] } sal aanvanklik in ons netwerkklas geskep word.
Een argument, groottes, word vereis deur die funksie Object() { [inheemse kode] }. Die groottes veranderlike is 'n versameling van numeriese waardes wat verteenwoordig die aantal inset nodusse teenwoordig in elke laag van ons neurale netwerk.
Ons inisialiseer vier eienskappe in ons __init__ metode. Die invoerveranderlikes, groottes, word gebruik om onderskeidelik die lys van laaggroottes en die aantal lae, num lae, te stel.
Die eerste stap is om ons netwerk se aanvanklike vooroordele ewekansig toe te ken aan elke laag wat op die invoerlaag volg.
Ten slotte, elke skakel tussen die inset- en uitsetlae se gewigte word ewekansig gegenereer. Np.Random.Randn() gee 'n ewekansige steekproef getrek uit die normaalverspreiding vir konteks.
Aanstuurfunksie
In 'n neurale netwerk word inligting deur die terugvoerfunksie vorentoe gestuur. Een argument, a, wat die huidige aktiveringsvektor aandui, sal deur hierdie funksie vereis word.
Hierdie funksie skat die aktiverings by elke laag deur al die vooroordele en gewigte in die netwerk te herhaal. Die antwoord wat gegee word, is die voorspelling, wat die aktiverings van die laaste laag is.
Mini-batch Gradiënt Afkoms
Ons Netwerkklas se werkesel is Gradient Descent. In hierdie weergawe gebruik ons mini-batch (stogastiese) gradiënt afkoms, 'n gewysigde variasie van gradiënt afkoms.
Dit dui aan dat 'n klein bondel datapunte gebruik sal word om ons model op te dateer. Vier vereiste en een opsionele argument word na hierdie metode oorgedra. Die vier vereiste veranderlikes is die opleidingsdatastel, die aantal tydperke, die grootte van die minigroepe en die leertempo (eta).
Toetsdata is op aanvraag beskikbaar. Ons sal toetsdata verskaf wanneer ons uiteindelik hierdie netwerk evalueer. Die aantal monsters in hierdie funksie word aanvanklik op die lengte van die lys gestel sodra die opleidingsdata in 'n lystipe omskep is.
Ons pas ook dieselfde proses toe om data te toets wat ingegee word. Dit is omdat hulle in plaas daarvan om as lyste aan ons teruggestuur te word, werklik ritslyste is. Wanneer ons later die MNIST-datamonsters laai, sal ons meer hieroor leer.
As ons kan seker maak dat ons beide soorte data as lyste verskaf, dan is hierdie tipe uitsaai nie noodwendig noodsaaklik nie.
Sodra ons die data het, gaan ons die opleidingstydperke in 'n lus oor. 'n Opleidingsperiode is slegs een rondte van neurale netwerk opleiding. Ons skommel eers die data in elke epog om ewekansigheid te verseker voordat ons 'n lys van mini-groepe maak.
Die opdatering van mini-joernaalfunksie, wat hieronder bespreek word, sal vir elke mini-joernaal geroep word. Die toetsakkuraatheid sal ook teruggestuur word indien die toetsdata beskikbaar is.
Koste-afgeleide helperfunksie
Kom ons ontwikkel eers 'n helperfunksie genaamd kosteafgeleide voordat ons werklik die terugpropagasiekode skep. As ons 'n fout in ons uitsetlaag maak, sal die koste-afgeleide funksie dit wys.
Dit vereis twee insette: die uitsetaktiveringsskikking en die y-koördinate van die verwagte uitsetwaardes.
Terugpropagasie funksie
Ons huidige aktiveringsvektor, aktivering, sowel as enige ander aktiveringsvektore, aktiverings en z-vektore, zs, moet almal in gedagte gehou word. 'n Laag genaamd die invoerlaag word eerste geaktiveer.
Ons sal elke vooroordeel en gewig deurlus nadat ons dit opgesit het. Elke lus behels die berekening van die z-vektor as die puntproduk van die gewigte en die aktivering, die byvoeging daarvan by die lys van zs, die herberekening van die aktivering en die byvoeging van die opgedateerde aktivering by die lys van aktiverings.
Ten slotte, die wiskunde. Die delta, wat gelyk is aan die fout van die vorige laag vermenigvuldig met die sigmoïede priem van die laaste element van die zs vektore, word bereken voordat ons ons terugwaartse pas begin.
Die laaste laag van nabla b is gestel om die delta te wees, en die laaste laag van nabla w is gestel om die puntproduk van die delta en die tweede-na-laaste laag van aktiverings te wees (getransponeer sodat ons eintlik die wiskunde kan doen) .
Ons gaan voort soos voorheen, begin met die tweede laag en sluit af met die laaste, en herhaal die proses nadat ons hierdie laaste lae voltooi het. Die nablas word dan as 'n tupel teruggegee.
Dateer tans Mini-batch gradiënt afkoms op
Ons SGD (stogastiese gradiënt afkoms) metode van voorheen inkorporeer mini-joernaal opdatering. Aangesien dit in SGD gebruik word, maar ook rugstut benodig, het ek gedebatteer waar om hierdie funksie te plaas.
Uiteindelik het ek die keuse gemaak om dit hier te plaas. Dit begin deur 0 vektore van die vooroordele en gewigte se nablas te genereer, net soos ons rugstutfunksie gedoen het.
Dit vereis die mini-batch en die eta-leertempo as sy twee insette. In die mini-batch gebruik ons dan die rugstut-funksie om die delta van elke nabla-skikking vir elke inset, x, en uitset, y, te verkry. Die nabla-lyste word dan met hierdie delta's bygewerk.
Ten slotte gebruik ons die leertempo en die nablas om die netwerk se gewigte en vooroordele op te dateer. Elke waarde word opgedateer na die mees onlangse waarde, minus die leertempo, vermenigvuldig met die minibatch-grootte, en dan by die nabla-waarde gevoeg.
Evalueer funksie
Die evalueer funksie is die laaste een wat ons moet skryf. Die toetsdata is die enigste invoer vir hierdie funksie. In hierdie funksie vergelyk ons slegs die uitsette van die netwerk met die verwagte resultaat, y. Deur die invoer, x, vorentoe te voer, word die uitsette van die netwerk bepaal.
Voltooi kode
Wanneer ons al die kode kombineer, is dit hoe dit lyk.
Toets neurale netwerk
Laai tans MNIST-data
Die MNIST data is in .pkl.gz-formaat, wat ons met GZIP sal oopmaak en met piekel laai. Kom ons skryf 'n vinnige metode om hierdie data te laai as 'n tupel van grootte drie, verdeel in opleiding, validering en toetsdata.
Om ons data makliker te bestuur, sal ons nog 'n funksie skryf om die y in 'n 10-item skikking te enkodeer. Die skikking sal almal 0'e wees, behalwe vir 'n 1 wat ooreenstem met die prent se regte syfer.
Ons sal die basiese laaidata en een warm enkodeermetode gebruik om ons data in 'n leesbare formaat te laai. Nog 'n funksie sal geskryf word wat ons x-waardes sal omskep in 'n lys van grootte 784, wat ooreenstem met die prent se 784 pixels, en ons y-waardes in hul enkele warm-gekodeerde vektorvorm.
Dan sal ons die x- en y-waardes kombineer sodat een indeks by die ander pas. Dit is van toepassing op die opleiding-, validerings- en toetsdatastelle. Ons gee dan die veranderde data terug.
Hardloop toetse
Ons sal 'n nuwe lêer genaamd "mnist loader" maak wat beide die neurale netwerk wat ons voorheen gevestig het (eenvoudige nn) en die MNIST-datastellaaier sal invoer voordat ons begin toets.
In hierdie lêer hoef ons net die data in te voer, 'n netwerk te bou met 'n invoerlaaggrootte van 784 en 'n uitvoerlaaggrootte van 10, die netwerk se SGD-funksie op die opleidingsdata uit te voer en dit dan te toets deur die toetsdata te gebruik.
Hou in gedagte dat vir ons lys van invoerlae, dit geen verskil maak wat enige van die getalle tussen 784 en 10 is nie. Ons kan die ander lae verander op enige manier wat ons wil; net die invoer- en uitvoergroottes is vasgestel.
Drie lae is nie nodig nie; ons kan vier, vyf of selfs net twee gebruik. Geniet dit om daarmee te eksperimenteer.
Gevolgtrekking
Hier, met behulp van Python 3, skep ons 'n neurale netwerk van nuuts af. Saam met hoëvlakwiskunde het ons ook die besonderhede van implementering bespreek.
Ons het begin deur helperfunksies te implementeer. Vir die neurone om te werk, is die sigmoïed- en sigmoïed-primafunksies van kardinale belang. Ons het dan die terugvoerfunksie in die praktyk gebring, wat die fundamentele proses is om data in die neurale netwerk in te voer.
Vervolgens het ons die gradiënt-afkomsfunksie in Python geskep, die enjin wat ons neurale netwerk dryf. Om "plaaslike minima" op te spoor en hul gewigte en vooroordele te optimaliseer, gebruik ons neurale netwerk gradiënt-afkoms. Ons het die terugpropagasie-funksie geskep deur gradiënt afkoms.
Deur opdaterings te lewer wanneer die uitsette nie ooreenstem met die regte etikette nie, stel hierdie funksie die neurale netwerk in staat om te "leer."
Uiteindelik plaas ons ons splinternuwe Python neurale netwerk na die toets deur die MNIST-datastel te gebruik. Alles het glad gefunksioneer.
Gelukkige kodering!
Lewer Kommentaar