Edukien aurkibidea[Ezkutatu][Erakutsi]
Garuna sare neuronalekin parekoa da. Hau da normalean irakasgaian dagoen norbaiti ikaskuntza automatikoaren eta neurona-sare artifizialen atzean dauden ideiak ulertzen laguntzeko erabiltzen den analogia.
Eszena atzean hainbat kalkulu matematiko eta estatistiko geruza daudenez, sare hauek funtzio matematiko gisa definitzea metodo aurreratuagoa da.
Ikaskuntza automatikoan interesa duten eta Python neurona-sare kodea nola idazten den ikusi nahi duten pertsonentzat da hau.
Artikulu honetan, guztiz konektatuta sare neuronal sakona (DNN) hutsetik nola eraiki erakutsiko dugu. Python 3.
Gure Python Sare Neuronalaren kodearen fitxategi-egituraren ikuspegi orokorra
Hemen hiru fitxategi sortuko dira. Lehenengoa nn.py fitxategi sinplea da, "Laguntza-funtzioak konfiguratzea" eta "Sare neuronalak hutsetik eraikitzea" atalean aztertuko dena.
Mnist loader.py izeneko fitxategi bat ere izango dugu probako datuak kargatzeko, "MNIST datuak kargatzen" atalean azaltzen den bezala.
Azkenik, test.py izeneko fitxategi bat izango dugu terminalean abiaraziko dena gure neurona-sarea probatzeko.
Fitxategi hau zehatz-mehatz deskribatzen da "Probak martxan" atalean.
instalazioa
Tutorial hau jarraitu ahal izateko NumPy Python liburutegia deskargatu behar da. Hau egin dezakezu terminalean komando hau erabiliz:
Moduluak inportatzea eta Laguntzaile funtzioa konfiguratzea
Behar ditugun bi liburutegi bakarrak ausazkoak eta NumPy dira, berehala inportatuko ditugunak. Gure sare neuronalaren hasierako pisuetarako, ausazko liburutegia erabiliz nahastuko ditugu.
Gure kalkuluak bizkortzeko, NumPy edo np erabiliko dugu (konbentzioz, askotan np gisa inportatzen da). Gure bi laguntzaile funtzioak inportatu ondoren egingo dira. Bi funtzio sigmoide: bat eta sigmoide lehen.
Erregresio logistikoak datuak sigmoide funtzioa erabiliz sailkatuko ditu, eta atzera-propagazioak, berriz, delta edo gradientea kalkulatuko du sigmoide lehen funtzioa erabiliz.
Sare klasea sortzea
Guztiz lotuta dagoen neurona-sare bat eraikitzea da atal honen ardatz bakarra. Sare klaseak ondoren datozen funtzio guztiak bilduko ditu. Object() { [berezko kodea] } funtzioa sortuko da hasiera batean gure sareko klasean.
Argumentu bat, tamainak, Objektua () { [berezko kodea] } funtzioak eskatzen du. Tamainen aldagaia gure sare neuronalaren geruza bakoitzean dagoen sarrera-nodo kopurua adierazten duen zenbakizko balioen bilduma da.
Lau propietate hasieratzen ditugu gure __init__ metodoan. Sarrerako aldagaiak, tamainak, geruza-tamainen zerrenda eta geruza kopurua, num geruza, hurrenez hurren, ezartzeko erabiltzen dira.
Lehenengo urratsa gure sarearen hasierako alborapenak ausaz esleitzea da sarrerako geruza jarraitzen duen geruza bakoitzari.
Azkenik, sarrerako eta irteerako geruzen arteko lotura bakoitzak bere pisuak ausaz sortzen ditu. Np.Random.Randn() testuingururako banaketa normaletik ateratako ausazko lagin bat ematen du.
Feed Forward Funtzioa
Neurona-sare batean, informazioa feedforward funtzioaren bidez bidaltzen da. Argumentu bat, a, uneko aktibazio-bektorea adierazten duena, funtzio honek beharko du.
Funtzio honek geruza bakoitzeko aktibazioak kalkulatzen ditu sareko alborapen eta pisu guztien gainean errepikatuz. Ematen den erantzuna iragarpena da, hau da, azken geruzaren aktibazioak.
Mini-lote Desnibel Jaitsiera
Gure Sareko klaseko zaldia Gradient Descent da. Bertsio honetan, mini-batch (estokastikoa) gradiente jaitsiera erabiltzen dugu, gradiente jaitsieraren aldaera aldatua.
Horrek adierazten du datu-puntu sorta txiki bat erabiliko dela gure eredua eguneratzeko. Derrigorrezko lau argumentu eta aukerako bat pasatzen dira metodo honetara. Beharrezko lau aldagaiak hauek dira: prestakuntza-datuen multzoa, aro kopurua, mini-loteen tamaina eta ikaskuntza-tasa (eta).
Proba datuak eskatuz gero eskuragarri daude. Proba datuak emango ditugu azkenean sare hau ebaluatzen dugunean. Funtzio honetako lagin-kopurua hasieran zerrendaren luzera ezartzen da prestakuntza-datuak zerrenda-mota bihurtu direnean.
Prozesu bera aplikatzen dugu ematen diren datuak probatzeko. Hau da, zerrenda gisa itzuli beharrean, zerrenden zip dira benetan. MNIST datuen laginak geroago kargatzen ditugunean, honi buruz gehiago ikasiko dugu.
Bi datu motak zerrenda gisa ematen ditugula ziurtatzen badugu, orduan mota-casting hau ez da ezinbestekoa izango.
Datuak ditugunean, entrenamendu-garaiak errepasatzen ditugu begizta batean. Prestakuntza-aldi bat neurona-sareen prestakuntza txanda bat baino ez da. Lehenik eta behin, aro bakoitzean datuak nahasten ditugu ausazkotasuna ziurtatzeko, mini-loteen zerrenda egin aurretik.
Jarraian azaltzen den mini-lotearen eguneratze funtzioa mini-lote bakoitzeko deituko da. Probaren zehaztasuna ere itzuliko da probaren datuak eskuragarri badira.
Kostu-eratorriko funtzio laguntzailea
Garatu dezagun kostu deribatua izeneko funtzio laguntzaile bat, atzera-propagazio kodea benetan sortu aurretik. Gure irteerako geruzan akatsen bat egiten badugu, kostu deribatuaren funtzioak erakutsiko du.
Bi sarrera behar ditu: irteerako aktibazioen array-a eta aurreikusitako irteera-balioen y-koordenatuak.
Atzera hedatzeko funtzioa
Gure egungo aktibazio-bektorea, aktibazioa, baita beste edozein aktibazio-bektore, aktibazio eta z-bektore, zs, kontuan izan behar dira. Sarrera geruza izeneko geruza bat aktibatzen da lehenik.
Alborapen eta pisu bakoitza begiztatuko dugu jarri ondoren. Begizta bakoitzak z bektorea pisuen eta aktibazioaren puntu-produktu gisa kalkulatzea dakar, z-en zerrendara gehitzea, aktibazioa berriro kalkulatzea eta aktibazio eguneratua aktibazioen zerrendara gehitzea.
Azkenik, matematika. Delta, hau da, aurreko geruzaren errorearen berdina zs bektoreen azken elementuaren lehen sigmoidearekin biderkatuta, gure atzerako pasea hasi aurretik kalkulatzen da.
Nabla b-ren azken geruza delta izateko ezarri da, eta nabla w-ren azken geruza deltaren eta aktibazioen azkenengo geruza (transposatuta, matematika egin ahal izateko) .
Lehen bezala jarraitzen dugu, bigarren geruzatik hasi eta azkenarekin amaituz, eta azken geruza hauek osatu ondoren prozesua errepikatuko dugu. Ondoren, nablak tupla gisa itzultzen dira.
Mini-batch gradiente jaitsiera eguneratzen
Gure SGD (gradiente estokastikoaren jaitsiera) metodoak mini-batch eguneratzea dakar. SGD-n erabiltzen denez baina backprop ere behar duenez, funtzio hau non jarri eztabaidatu nuen.
Azkenik, hemen argitaratzeko hautua egin nuen. Alborapenen eta pisuen nablasen 0 bektore sortzen hasten da, gure backprop funtzioak egin zuen bezala.
Mini-lotea eta eta ikaskuntza-tasa behar ditu bere bi sarrera gisa. Mini-lotean, ondoren backprop funtzioa erabiltzen dugu nabla array bakoitzaren delta lortzeko sarrera, x eta irteera, y bakoitzerako. Nabla zerrendak delta hauekin eguneratzen dira.
Azkenik, ikaskuntza-tasa eta nablak erabiltzen ditugu sarearen pisuak eta alborapenak eguneratzeko. Balio bakoitza balio berrienera eguneratzen da, ikasketa-tasa gutxiago, minibatch-aren tamainaz biderkatu eta gero nabla baliora gehitzen da.
Funtzioa ebaluatu
Ebaluatzeko funtzioa da idatzi behar dugun azkena. Proba datuak funtzio honen sarrera bakarra dira. Funtzio honetan, sarearen irteerak aurreikusitako emaitzarekin, y, soilik konparatzen ditugu. Sarrera, x, aurrera elikatuz, sarearen irteerak zehazten dira.
Kode osoa
Kode guztia konbinatzen dugunean, horrela agertzen da.
Sare Neuronala probatzen
MNIST datuak kargatzen
The MNIST datuak .pkl.gz formatuan dago, GZIP erabiliz irekiko dugu eta picklez kargatuko dugu. Idatz dezagun metodo azkar bat datu hauek hiru tamainako tupla gisa kargatzeko, prestakuntza, baliozkotze eta proba datuetan banatuta.
Gure datuak errazago kudeatzeko, beste funtzio bat idatziko dugu y-a 10 elementuko array batean kodetzeko. Matrizea 0 guztiak izango dira irudiaren zifra egokiarekin bat datorren 1 bat izan ezik.
Oinarrizko karga-datuak eta kodetze beroko metodo bat erabiliko ditugu gure datuak formatu irakurgarri batean kargatzeko. Beste funtzio bat idatziko da, gure x balioak 784 tamainako zerrenda batean bihurtuko dituena, irudiaren 784 pixelekin bat datorrena, eta gure y balioak kodetutako forma bektorial bakarrean.
Ondoren, x eta y balioak konbinatuko ditugu indize bat bestearekin bat etor dadin. Hau prestakuntza, baliozkotze eta proba datu multzoei aplikatzen zaie. Ondoren, aldatutako datuak itzuliko ditugu.
Korrika Probak
"mnist loader" izeneko fitxategi berri bat egingo dugu, aurretik ezarri genuen neurona-sarea (nn sinplea) eta MNIST datu-multzoen kargatzailea inportatuko dituena probatzen hasi aurretik.
Fitxategi honetan, egin behar dugun guztia datuak inportatu, sarrerako geruza 784 eta irteerako geruzaren tamaina duen sarea eraikitzea da, sareko SGD funtzioa exekutatu prestakuntza-datuetan, eta probatu proba-datuak erabiliz.
Kontuan izan gure sarrera-geruzen zerrendarako ez duela alderik 784 eta 10 artean dauden zenbakiek. Beste geruzak nahi dugun moduan alda ditzakegu; sarrerako eta irteerako tamainak finkoak dira.
Hiru geruza ez dira beharrezkoak; lau, bost edo bi besterik ez erabil ditzakegu. Ondo pasa horrekin esperimentatzen.
Ondorioa
Hemen, Python 3 erabiliz, sare neuronal bat sortzen dugu hutsetik. Goi-mailako matematikarekin batera, ezarpenaren berezitasunak ere eztabaidatu ditugu.
Laguntza-funtzioak ezartzen hasi ginen. Neuronek funtziona dezaten, funtsezkoak dira sigmoide eta sigmoide lehen funtzioak. Ondoren, feedforward funtzioa praktikan jartzen dugu, hau da, sare neuronalean datuak elikatzeko oinarrizko prozesua.
Jarraian, Python-en jaitsiera degradatuaren funtzioa sortu dugu, gure sare neuronalak gidatzen dituen motorra. "Minimo lokalak" kokatzeko eta haien pisuak eta alborapenak optimizatzeko, gure sare neuronalak gradienteen jaitsiera erabiltzen du. Backpropagation funtzioa erabiliz sortu dugu desnibel jaitsiera.
Irteerak etiketa egokiekin bat ez datozenean eguneraketak emanez, funtzio honek neurona-sareak "ikastea" ahalbidetzen du.
Azkenik, gure Python berria jarri dugu sare neural MNIST datu multzoa erabiliz probara. Dena ondo funtzionatu zuen.
Kodetze zoriontsua!
Utzi erantzun bat