Përmbajtje[Fshih][Shfaqje]
Truri është i krahasueshëm me rrjetet nervore. Kjo është analogjia që përdoret zakonisht për të ndihmuar dikë të ri në këtë temë për të kuptuar idetë prapa mësimit të makinerive dhe rrjeteve nervore artificiale.
Për shkak se ka disa shtresa të llogaritjeve matematikore dhe statistikore që ndodhin prapa skenave, përcaktimi i këtyre rrjeteve si një funksion matematikor është një metodë më e avancuar.
Kjo është për njerëzit që janë në të vërtetë të interesuar në mësimin e makinerive dhe duan të shohin se si shkruhet kodi i rrjetit nervor Python.
Në këtë artikull, ne do të demonstrojmë se si të ndërtojmë një rrjet nervor të thellë plotësisht të lidhur (DNN) nga e para. Piton 3.
Një përmbledhje e strukturës së skedarit për kodin tonë të rrjetit nervor Python
Këtu do të krijohen tre skedarë. I pari është skedari i thjeshtë nn.py, i cili do të diskutohet në "Konfigurimi i funksioneve ndihmëse" dhe "Ndërtimi i rrjetit nervor nga e para".
Ne do të kemi gjithashtu një skedar të quajtur mnist loader.py për të ngarkuar të dhënat e testimit, siç përshkruhet në "Ngarkimi i të dhënave MNIST".
Më në fund, do të kemi një skedar të quajtur test.py që do të lëshohet në terminal për të testuar rrjetin tonë nervor.
Ky skedar përshkruhet në detaje në "Testet e ekzekutimit".
Instalim
Biblioteka NumPy Python duhet të shkarkohet për të ndjekur këtë tutorial. Ju mund ta arrini këtë duke përdorur komandën e mëposhtme në terminal:
Importimi i moduleve dhe konfigurimi i funksionit Ndihmës
Dy bibliotekat e vetme që kërkojmë janë të rastësishme dhe NumPy, të cilat do t'i importojmë menjëherë. Për peshat fillestare të rrjetit tonë nervor, ne do t'i përziejmë ato duke përdorur bibliotekën e rastësishme.
Për të përshpejtuar llogaritjet tona, ne do të përdorim NumPy ose np (sipas konventës, shpesh importohet si np). Dy funksionet tona ndihmëse do të bëhen pas importeve tona. Dy funksione sigmoide: një dhe sigmoid i thjeshtë.
Regresioni logjistik do të klasifikojë të dhënat duke përdorur funksionin sigmoid, ndërsa përhapja e pasme do të llogarisë deltën ose gradientin duke përdorur funksionin kryesor sigmoid.
Krijimi i klasës së rrjetit
Ndërtimi i një rrjeti nervor plotësisht të lidhur është fokusi i vetëm i këtij seksioni. Klasa e rrjetit do të përfshijë të gjitha funksionet që vijnë më pas. Funksioni Object() { [kodi vendas] } do të krijohet fillimisht në klasën e rrjetit tonë.
Një argument, madhësitë, kërkohet nga funksioni Object() { [kodi vendas] }. Variabla e madhësive është një koleksion vlerash numerike që përfaqëson numrin e nyjeve hyrëse të pranishme në secilën shtresë të rrjetit tonë nervor.
Ne inicializojmë katër veti në metodën tonë __init__. Variablat e hyrjes, madhësitë, përdoren për të vendosur listën e madhësive të shtresave dhe numrin e shtresave, num shtresa, përkatësisht.
Hapi i parë është caktimi i rastësishëm i paragjykimeve fillestare të rrjetit tonë në secilën shtresë që ndjek shtresën hyrëse.
Së fundi, çdo lidhje midis shtresave hyrëse dhe dalëse ka peshën e saj të krijuar në mënyrë të rastësishme. Np.Random.Randn() jep një mostër të rastësishme të nxjerrë nga shpërndarja normale për kontekstin.
Funksioni i furnizimit përpara
Në një rrjet nervor, informacioni dërgohet përpara nga funksioni feedforward. Një argument, a, që tregon vektorin aktual të aktivizimit, do të kërkohet nga ky funksion.
Ky funksion vlerëson aktivizimet në secilën shtresë duke përsëritur mbi të gjitha paragjykimet dhe peshat në rrjet. Përgjigja e dhënë është parashikimi, që është aktivizimi i shtresës së fundit.
Zbritja me gradient mini-batch
Kali i punës i klasës sonë Rrjeti është Gradient Descent. Në këtë version, ne përdorim zbritjen gradient mini-batch (stochastic), një variacion i modifikuar i zbritjes gradient.
Kjo tregon se një grup i vogël pikash të dhënash do të përdoret për të përditësuar modelin tonë. Katër argumente të kërkuara dhe një opsional i kalohen kësaj metode. Katër variablat e kërkuara janë grupi i të dhënave të trajnimit, numri i epokave, madhësia e mini-batcheve dhe shkalla e të mësuarit (eta).
Të dhënat e testit janë të disponueshme sipas kërkesës. Ne do të ofrojmë të dhëna testimi kur të vlerësojmë përfundimisht këtë rrjet. Numri i mostrave në këtë funksion vendoset fillimisht në gjatësinë e listës pasi të dhënat e trajnimit të jenë shndërruar në një lloj liste.
Ne gjithashtu aplikojmë të njëjtin proces për testimin e të dhënave që jepen. Kjo ndodh sepse në vend që të na kthehen si lista, ato janë me të vërtetë zipa listash. Kur të ngarkojmë më vonë mostrat e të dhënave MNIST, do të mësojmë më shumë rreth kësaj.
Nëse mund të sigurohemi që ne ofrojmë të dyja llojet e të dhënave si lista, atëherë ky lloj-cast nuk është domosdoshmërisht thelbësor.
Pasi të kemi të dhënat, kalojmë epokat e trajnimit në një lak. Një periudhë trajnimi është vetëm një raund i trajnimit të rrjetit nervor. Ne fillimisht i përziejmë të dhënat në çdo epokë për të siguruar rastësi përpara se të bëjmë një listë të mini-batcheve.
Funksioni mini-batch i përditësimit, i cili diskutohet më poshtë, do të thirret për çdo mini-batch. Saktësia e testit do të kthehet gjithashtu nëse të dhënat e testit janë të disponueshme.
Funksioni ndihmës derivativ i kostos
Le të zhvillojmë së pari një funksion ndihmës të quajtur derivativi i kostos përpara se të krijojmë vërtet kodin e përhapjes së pasme. Nëse bëjmë një gabim në shtresën tonë të prodhimit, funksioni i derivatit të kostos do ta tregojë atë.
Ai kërkon dy hyrje: grupin e aktivizimeve të daljes dhe koordinatat y të vlerave të parashikuara të daljes.
Funksioni i përhapjes së pasme
Vektori ynë aktual i aktivizimit, aktivizimi, si dhe çdo vektor tjetër aktivizimi, aktivizimi dhe z-vektorët, zs, duhet të mbahen parasysh të gjithë. Fillimisht aktivizohet një shtresë e quajtur shtresa hyrëse.
Ne do të shqyrtojmë çdo paragjykim dhe peshë pasi t'i vendosim ato. Çdo lak përfshin llogaritjen e vektorit z si produkt me pika të peshave dhe aktivizimit, shtimin e tij në listën e zs, rillogaritjen e aktivizimit dhe shtimin e aktivizimit të përditësuar në listën e aktivizimeve.
Më në fund, matematika. Delta, e cila është e barabartë me gabimin nga shtresa e mëparshme e shumëzuar me prim sigmoid të elementit të fundit të vektorëve zs, llogaritet përpara se të fillojmë kalimin prapa.
Shtresa e fundit e nabla b është vendosur të jetë delta, dhe shtresa përfundimtare e nabla w është caktuar të jetë produkti me pika i deltës dhe shtresa e dytë në të fundit të aktivizimeve (transpozohet në mënyrë që të mund të bëjmë llogaritjen) .
Vazhdojmë si më parë, duke filluar nga shtresa e dytë dhe duke përfunduar me të fundit dhe e përsërisim procesin pasi të kemi përfunduar këto shtresa të fundit. Nablas pastaj kthehen si një tufë.
Po përditësohet zbritja e gradientit të grupeve të vogla
Metoda jonë SGD (zbritja e gradientit stokastik) e mëparshme përfshin përditësimin mini-batch. Meqenëse përdoret në SGD, por gjithashtu kërkon mbështetje, kam debatuar se ku ta vendos këtë funksion.
Më në fund, bëra zgjedhjen ta postoja këtu. Fillon duke gjeneruar 0 vektorë të nablave të paragjykimeve dhe peshave, ashtu si funksioni ynë mbështetës.
Ai kërkon mini-batch dhe shkallën e të mësuarit eta si dy hyrjet e tij. Në mini-batch, ne përdorim më pas funksionin backprop për të marrë deltën e çdo grupi nabla për çdo hyrje, x dhe dalje, y. Listat nabla përditësohen më pas me këto delta.
Së fundi, ne përdorim normën e të mësuarit dhe nablas për të përditësuar peshat dhe paragjykimet e rrjetit. Çdo vlerë përditësohet në vlerën më të fundit, minus normën e të mësuarit, shumëzuar me madhësinë e vogël të grupit dhe më pas i shtohet vlerës nabla.
Vlerësoni funksionin
Funksioni i vlerësimit është ai i fundit që duhet të shkruajmë. Të dhënat e testit janë të dhënat e vetme për këtë funksion. Në këtë funksion, ne krahasojmë vetëm daljet e rrjetit me rezultatin e parashikuar, y. Duke ushqyer hyrjen, x, përpara, përcaktohen daljet e rrjetit.
Kodi i plotë
Kur kombinojmë të gjithë kodin, kështu duket.
Testimi i rrjetit nervor
Po ngarkohen të dhënat e MNIST
La Të dhënat e MNIST-it është në formatin .pkl.gz, të cilin do ta hapim duke përdorur GZIP dhe do ta ngarkojmë me turshi. Le të shkruajmë një metodë të shpejtë për të ngarkuar këto të dhëna si një tufë me madhësi tre, të ndarë në të dhëna trajnimi, vërtetimi dhe testimi.
Për ta bërë më të lehtë menaxhimin e të dhënave tona, ne do të shkruajmë një funksion tjetër për të koduar y në një grup prej 10 artikujsh. Vargu do të jetë të gjitha 0-të, përveç një 1 që përputhet me shifrën e duhur të figurës.
Ne do të përdorim të dhënat bazë të ngarkesës dhe një metodë të kodimit të nxehtë për të ngarkuar të dhënat tona në një format të lexueshëm. Do të shkruhet një funksion tjetër që do të konvertojë vlerat tona x në një listë me madhësi 784, që përputhet me 784 pikselët e imazhit, dhe vlerat tona y në formën e tyre të vetme vektoriale të koduar të nxehtë.
Pastaj ne do të kombinojmë vlerat x dhe y në mënyrë që njëri indeks të përputhet me tjetrin. Kjo vlen për grupet e të dhënave të trajnimit, vërtetimit dhe testimit. Më pas kthejmë të dhënat e ndryshuara.
Drejtimi i testeve
Ne do të krijojmë një skedar të ri të quajtur "mnist loader" që do të importojë si rrjetin nervor që kemi krijuar më parë (nn i thjeshtë) ashtu edhe ngarkuesin e grupit të të dhënave MNIST përpara se të fillojmë testimin.
Në këtë skedar, gjithçka që duhet të bëjmë është të importojmë të dhënat, të ndërtojmë një rrjet me një madhësi të shtresës hyrëse 784 dhe një madhësi të shtresës dalëse 10, të ekzekutojmë funksionin SGD të rrjetit në të dhënat e trajnimit, pastaj ta testojmë duke përdorur të dhënat e testit.
Mbani në mend se për listën tonë të shtresave hyrëse, nuk ka dallim se cili nga numrat është midis 784 dhe 10. Ne mund t'i ndryshojmë shtresat e tjera sipas dëshirës; vetëm madhësitë hyrëse dhe dalëse janë fikse.
Tre shtresa nuk janë të nevojshme; ne mund të përdorim katër, pesë, apo edhe vetëm dy. Argëtohuni duke eksperimentuar me të.
Përfundim
Këtu, duke përdorur Python 3, ne krijojmë një rrjet nervor nga e para. Së bashku me matematikën e nivelit të lartë, diskutuam edhe specifikat e zbatimit.
Filluam duke zbatuar funksionet ndihmëse. Që neuronet të funksionojnë, funksionet kryesore sigmoide dhe sigmoide janë thelbësore. Më pas ne kemi vënë në praktikë funksionin feedforward, i cili është procesi themelor për futjen e të dhënave në rrjetin nervor.
Më pas, ne krijuam funksionin e zbritjes së gradientit në Python, motori që drejton rrjetin tonë nervor. Për të gjetur "minimumet lokale" dhe për të optimizuar peshat dhe paragjykimet e tyre, rrjeti ynë nervor përdor zbritjen gradient. Ne krijuam funksionin e përhapjes së pasme duke përdorur zbritje gradient.
Duke dhënë përditësime kur rezultatet nuk përputhen me etiketat e duhura, ky funksion mundëson që rrjeti nervor të "mësojë".
Më në fund, vendosëm Python-in tonë krejt të ri Rrjeti nervoz në test duke përdorur grupin e të dhënave MNIST. Gjithçka funksionoi pa probleme.
Gëzuar Kodimin!
Lini një Përgjigju