Enhavtabelo[Kaŝi][Montri]
La cerbo estas komparebla al neŭralaj retoj. Ĉi tiu estas la analogio, kiu estas kutime uzata por helpi iun novan al la temo kompreni la ideojn malantaŭ maŝinlernado kaj artefaritaj neŭralaj retoj.
Ĉar ekzistas pluraj tavoloj de matematikaj kaj statistikaj komputadoj okazantaj malantaŭ la scenoj, difini tiujn retojn kiel matematikan funkcion estas pli progresinta metodo.
Ĉi tio estas por homoj, kiuj efektive interesiĝas pri maŝinlernado kaj volas vidi kiel Python-neŭrala reto-kodo estas skribita.
En ĉi tiu artikolo, ni montros kiel konstrui plene konektitan profundan neŭralan reton (DNN) de nulo. python 3.
Superrigardo de la Dosiera Strukturo por Nia Python Neŭrala Reto Kodo
Estos tri dosieroj kreitaj ĉi tie. La unua estas la simpla nn.py-dosiero, kiu estos diskutita en "Agordo de Helpaj Funkcioj" kaj "Konstruado de la Neŭrala Reto de Nulo."
Ni ankaŭ havos dosieron nomitan mnist loader.py por ŝargi la testajn datumojn, kiel priskribite en "Ŝargi MNIST-datumojn."
Fine, ni havos dosieron nomitan test.py kiu estos lanĉita en la terminalo por testi nian neŭralan reton.
Ĉi tiu dosiero estas detale priskribita en "Runantaj Testoj".
instalado
La biblioteko NumPy Python devas esti elŝutita por sekvi ĉi tiun lernilon. Vi povas plenumi ĉi tion uzante la jenan komandon en la terminalo:
Importi Modulojn kaj agordi la Helpan funkcion
La nuraj du bibliotekoj, kiujn ni postulas, estas hazardaj kaj NumPy, kiujn ni tuj importos. Por la komencaj pezoj de nia neŭrala reto, ni miksos ilin uzante la hazardan bibliotekon.
Por akceli niajn komputadon, ni uzos NumPy aŭ np (laŭ konvencio, ĝi ofte estas importita kiel np). Niaj du helpaj funkcioj estos faritaj post niaj importoj. Du sigmoidaj funkcioj: unu kaj sigmoida primo.
Loĝistika regreso klasifikos datenojn uzante la sigmoidan funkcion, dum malantaŭa disvastigo kalkulos la delton aŭ gradienton uzante la sigmoidan priman funkcion.
Kreante Retan Klason
Konstrui plene ligitan neŭralan reton estas la nura fokuso de ĉi tiu sekcio. La retoklaso ampleksas ĉiujn funkciojn kiuj venas poste. La funkcio Object() { [denaska kodo] } estos kreita komence en nia retoklaso.
Unu argumento, grandecoj, estas postulata de la funkcio Object() { [denaska kodo] }. La variaj grandecoj estas kolekto de nombraj valoroj, kiuj reprezentas la nombron da enirnodoj ĉeestantaj en ĉiu tavolo de nia neŭrala reto.
Ni pravigas kvar ecojn en nia __init__ metodo. La eniga variabloj, grandecoj, estas uzataj por agordi la liston de tavolgrandoj kaj la nombro da tavoloj, num tavoloj, respektive.
La unua paŝo estas hazarde asigni la komencajn biasojn de nia reto al ĉiu tavolo kiu sekvas la enirtavolon.
Finfine, ĉiu ligo inter la eniga kaj eligotavoloj havas siajn pezojn hazarde generitaj. Np.Random.Randn() donas hazardan specimenon desegnitan de la normala distribuo por kunteksto.
Funkcio Feed Forward
En neŭrala reto, informoj estas senditaj antaŭen per la feedforward funkcio. Unu argumento, a, indikanta la nunan aktivigan vektoron, estos postulata de ĉi tiu funkcio.
Ĉi tiu funkcio taksas la aktivigojn ĉe ĉiu tavolo per ripetado super ĉiuj biasoj kaj pezoj en la reto. La respondo donita estas la antaŭdiro, kiu estas la aktivigoj de la lasta tavolo.
Mini-batch Gradient Descent
La laborĉevalo de nia Reta klaso estas Gradient Descent. En ĉi tiu versio, ni uzas mini-baĉan (stokastikan) gradientdevenon, modifitan varion de gradientdeveno.
Ĉi tio indikas, ke malgranda aro da datumpunktoj estos uzata por ĝisdatigi nian modelon. Kvar postulataj kaj unu laŭvola argumento estas pasitaj al ĉi tiu metodo. La kvar postulataj variabloj estas la trejna datumaro, la nombro da epokoj, la grandeco de la mini-aroj kaj la lernprocento (eta).
Testaj datumoj estas haveblaj laŭ peto. Ni liveros testajn datumojn kiam ni eventuale taksos ĉi tiun reton. La nombro da specimenoj en ĉi tiu funkcio estas komence agordita al la longo de la listo post kiam la trejnaj datumoj estis transformitaj en listospecon.
Ni ankaŭ aplikas la saman procezon por testi datumojn kiuj estas donitaj. Ĉi tio estas ĉar anstataŭ esti resenditaj al ni kiel listoj, ili estas vere zipoj de listoj. Kiam ni poste ŝarĝos la MNIST-datumajn specimenojn, ni lernos pli pri tio.
Se ni povas certigi, ke ni provizas ambaŭ specojn de datumoj kiel listoj, tiam ĉi tiu tipo-castado ne estas nepre esenca.
Post kiam ni havas la datumojn, ni trapasas la trejnajn epokojn en buklo. Trejnadperiodo estas nur unu rondo de neŭrala reto-trejnado. Ni unue miksas la datumojn en ĉiu epoko por certigi hazardon antaŭ ol fari liston de mini-aroj.
La ĝisdatiga mini-aro, kiu estas diskutita malsupre, estos nomita por ĉiu mini-aro. La testa precizeco ankaŭ estos resendita se la testaj datumoj estas disponeblaj.
Kost-deriva helpa funkcio
Ni disvolvu helpan funkcion nomatan kostderivaĵo unue antaŭ ol ni vere kreos la malantaŭan disvastigan kodon. Se ni eraras en nia eliga tavolo, la kosto-deriva funkcio montros ĝin.
Ĝi postulas du enigaĵojn: la produktaĵaktivigilaro kaj la y-koordinatoj de la antaŭviditaj produktaĵvaloroj.
Funkcio de malantaŭa propagado
Nia nuna aktiviga vektoro, aktivigo, same kiel iuj aliaj aktivigaj vektoroj, aktivigoj kaj z-vektoroj, zs, ĉiuj devas esti konservitaj en menso. Unue aktiviĝas tavolo nomata eniga tavolo.
Ni trarigardos ĉiun antaŭjuĝon kaj pezon post kiam ili metis ilin. Ĉiu buklo implikas kalkuli la z-vektoron kiel la punktoprodukto de la pezoj kaj la aktivigo, aldonante ĝin al la listo de zs, rekalkulante la aktivigon, kaj aldonante la ĝisdatigitan aktivigon al la listo de aktivigoj.
Fine, la matematiko. La delto, kiu estas egala al la eraro de la antaŭa tavolo multiplikita per la sigmoida primo de la lasta elemento de la zs-vektoroj, estas komputita antaŭ ol ni komencas nian malantaŭan paŝon.
La lasta tavolo de nabla b estas agordita por esti la delto, kaj la fina tavolo de nabla w estas agordita por esti la punktoprodukto de la delto kaj la dua-antaŭlasta tavolo de aktivigoj (transmetita tiel ni povas fakte fari la matematikon) .
Ni daŭrigas kiel antaŭe, komencante per la dua tavolo kaj konkludante per la lasta, kaj ripetas la procezon post kompletigi ĉi tiujn lastajn tavolojn. La nablas tiam estas redonitaj kiel opo.
Ĝisdatigante Mini-baĉan gradientdevenon
Nia SGD (stokasta gradienta deveno) metodo de antaŭe korpigas mini-lokan ĝisdatigon. Ĉar ĝi estas uzata en SGD sed ankaŭ postulas backprop, mi diskutis kie meti ĉi tiun funkcion.
Fine, mi elektis afiŝi ĝin ĉi tie. Ĝi komenciĝas per generado de 0 vektoroj de la nablas de la biasoj kaj pezoj, same kiel nia backprop-funkcio faris.
Ĝi postulas la mini-baĉon kaj la eta-lernprocenton kiel ĝiajn du enigaĵojn. En la mini-aro, ni tiam uzas la backprop-funkcion por akiri la delton de ĉiu nabla tabelo por ĉiu enigo, x, kaj eligo, y. La nablaj listoj tiam estas ĝisdatigitaj kun ĉi tiuj deltoj.
Fine, ni uzas la lernadon kaj la nablas por ĝisdatigi la pezojn kaj biasojn de la reto. Ĉiu valoro estas ĝisdatigita al la plej lastatempa valoro, malpli la lernprocenton, multobligita per la minibatch grandeco, kaj tiam aldonita al la nabla valoro.
Taksi funkcion
La taksa funkcio estas la fina, kiun ni devas skribi. La testaj datumoj estas la nura enigo por ĉi tiu funkcio. En ĉi tiu funkcio, ni komparas nur la elirojn de la reto kun la antaŭvidita rezulto, y. Nutrante la enigaĵon, x, antaŭen, la eliroj de la reto estas determinitaj.
Kompleta Kodo
Kiam ni kombinas la tutan kodon, jen kiel ĝi aperas.
Testo de Neŭrala Reto
Ŝarĝante MNIST-datumojn
la MNIST-datumoj estas en .pkl.gz-formato, kiun ni malfermos per GZIP kaj ŝarĝos per piklado. Ni skribu rapidan metodon por ŝargi ĉi tiujn datumojn kiel opon de grandeco tri, dividita en trejnadon, validigon kaj testajn datumojn.
Por plifaciligi niajn datumojn, ni skribos alian funkcion por kodi la y en 10-eman tabelon. La tabelo estos ĉiuj 0-oj krom 1 kiu kongruas kun la ĝusta cifero de la bildo.
Ni uzos la bazajn ŝarĝajn datumojn kaj unu varman kodan metodon por ŝargi niajn datumojn en legeblan formaton. Alia funkcio estos skribita, kiu konvertos niajn x-valorojn en liston de grandeco 784, kongruanta al la 784-pikseloj de la bildo, kaj niajn y-valorojn en ilian ununuran varman koditan vektoran formon.
Tiam ni kombinos la x kaj y valorojn tiel ke unu indekso kongruas kun la alia. Ĉi tio validas por la trejnado, validumado, kaj testaj datumaj aroj. Ni tiam resendas la ŝanĝitajn datumojn.
Kurado de Testoj
Ni faros novan dosieron nomatan "mnist loader" kiu importos kaj la neŭralan reton, kiun ni antaŭe establis (simpla nn) kaj la MNIST-datumŝarĝilon antaŭ ol ni komencos testi.
En ĉi tiu dosiero, ĉio, kion ni devas fari, estas importi la datumojn, konstrui reton kun eniga tavolgrandeco de 784 kaj eligotavola grandeco de 10, ruli la SGD-funkcion de la reto sur la trejnaddatumoj, tiam testi ĝin uzante la testajn datumojn.
Memoru, ke por nia listo de enirtavoloj, ne gravas, kio iu el la nombroj estas inter 784 kaj 10. Ni povas ŝanĝi la aliajn tavolojn kiel ajn ni ŝatas; nur la enigo kaj eligo grandecoj estas fiksitaj.
Tri tavoloj ne estas necesaj; ni povus uzi kvar, kvin, aŭ eĉ nur du. Amuziĝu eksperimentante kun ĝi.
konkludo
Ĉi tie, uzante Python 3, ni kreas neŭralan reton de nulo. Kune kun altnivela matematiko, ni ankaŭ diskutis la specifaĵojn de efektivigo.
Ni komencis efektivigante helpajn funkciojn. Por ke la neŭronoj funkciu, la sigmoidaj kaj sigmoidaj primaj funkcioj estas decidaj. Ni tiam praktikas la feedforward-funkcion, kiu estas la fundamenta procezo por nutri datumojn en la neŭralan reton.
Poste, ni kreis la gradienta descenda funkcio en Python, la motoro kiu veturas nian neŭralan reton. Por lokalizi "lokajn minimumojn" kaj optimumigi iliajn pezojn kaj biasojn, nia neŭrala reto uzas gradientdevenon. Ni kreis la malantaŭan disvastigan funkcion uzante gradienta descendo.
Liverante ĝisdatigojn kiam la eliroj ne kongruas kun la taŭgaj etikedoj, ĉi tiu funkcio ebligas al la neŭrala reto "lerni".
Fine ni metas nian tutnovan Python Neŭra reto al la testo uzante la MNIST-datumaron. Ĉio funkciis glate.
Feliĉan Kodigon!
Lasi Respondon