Sisukord[Peida][Näita]
Aju on võrreldav närvivõrkudega. See on analoogia, mida tavaliselt kasutatakse selleks, et aidata kellelgi, kes on teemaga uus, mõista masinõppe ja tehisnärvivõrkude ideid.
Kuna kulisside taga toimub mitu matemaatiliste ja statistiliste arvutuste kihti, on nende võrkude määratlemine matemaatilise funktsioonina arenenum meetod.
See on mõeldud inimestele, kes on tegelikult huvitatud masinõppest ja soovivad näha, kuidas Pythoni närvivõrgu koodi kirjutatakse.
Selles artiklis näitame, kuidas luua täielikult ühendatud sügav närvivõrk (DNN) nullist. Python 3.
Ülevaade meie Pythoni närvivõrgu koodi failistruktuurist
Siin luuakse kolm faili. Esimene on lihtne fail nn.py, mida arutatakse jaotistes „Abifunktsioonide seadistamine” ja „Närvivõrgu nullist ülesehitamine”.
Meil on ka testandmete laadimiseks fail nimega mnist loader.py, nagu on kirjeldatud jaotises „MNIST-andmete laadimine”.
Lõpuks on meil fail nimega test.py, mis käivitatakse terminalis meie närvivõrgu testimiseks.
Seda faili kirjeldatakse üksikasjalikult jaotises „Testide käitamine”.
paigaldamine
Selle õpetuse järgimiseks tuleb alla laadida NumPy Pythoni teek. Seda saate teha, kasutades terminalis järgmist käsku:
Moodulite importimine ja abistaja funktsiooni seadistamine
Ainsad kaks teeki, mida vajame, on juhuslik ja NumPy, mille impordime kohe. Meie närvivõrgu esialgsete kaalude jaoks segame need juhusliku teegi abil.
Arvutuste kiirendamiseks kasutame NumPy või np (kokkuleppe kohaselt imporditakse see sageli np-na). Meie kaks abifunktsiooni tehakse pärast importi. Kaks sigmoidset funktsiooni: üks ja sigmoidne algfunktsioon.
Logistiline regressioon klassifitseerib andmed sigmoidfunktsiooni abil, samas kui tagasilevimine arvutab delta või gradiendi sigmoidse algfunktsiooni abil.
Võrguklassi loomine
Täielikult seotud närvivõrgu loomine on selle jaotise ainus eesmärk. Võrguklass hõlmab kõiki järgnevaid funktsioone. Funktsioon Object() { [native code] } luuakse algselt meie võrguklassis.
Funktsioon Object() { [native code] } nõuab ühte argumenti, suurusi. Suuruse muutuja on arvväärtuste kogum, mis tähistab meie närvivõrgu igas kihis olevate sisendsõlmede arvu.
Initsialiseerime neli atribuuti meie __init__ meetodil. Sisendmuutujaid, suurusi, kasutatakse vastavalt kihi suuruste loendi ja kihtide arvu, kihtide arvu määramiseks.
Esimene samm on juhuslikult määrata meie võrgu esialgsed eelarvamused igale sisendkihile järgnevale kihile.
Lõpuks genereeritakse igal sisend- ja väljundkihi vahelisel lingil oma kaalud juhuslikult. Np.Random.Randn() annab konteksti normaaljaotusest võetud juhusliku valimi.
Edasisuunamise funktsioon
Närvivõrgus saadab teavet edasisuunamisfunktsioon. See funktsioon nõuab ühte argumenti a, mis näitab praegust aktiveerimisvektorit.
See funktsioon hindab aktiveerimisi igas kihis, kordades kõiki võrgu nihkeid ja kaalusid. Antud vastus on ennustus, mis on viimase kihi aktiveerimised.
Minipartii gradiendi laskumine
Meie võrguklassi tööhobune on Gradient Descent. Selles versioonis kasutame minipartii (stohhastilist) gradiendi laskumist, mis on gradiendi laskumise modifitseeritud variatsioon.
See näitab, et meie mudeli värskendamiseks kasutatakse väikest kogumit andmepunkte. Sellele meetodile antakse edasi neli kohustuslikku ja üks valikuline argument. Neli nõutavat muutujat on koolitusandmete kogum, perioodide arv, minipartiide suurus ja õppimiskiirus (eta).
Katseandmed on saadaval nõudmisel. Edastame testiandmed, kui seda võrku lõpuks hindame. Selle funktsiooni näidiste arv määratakse algselt loendi pikkusele, kui koolitusandmed on loenditüübiks teisendatud.
Sama protsessi rakendame ka sisestatavate andmete testimiseks. Selle põhjuseks on asjaolu, et selle asemel, et neid meile loenditena tagastada, on need tõesti loendite zip. Kui laadime MNIST-i andmenäidised hiljem, saame selle kohta rohkem teada.
Kui saame tagada, et pakume mõlemat tüüpi andmeid loenditena, pole see tüübivalik tingimata hädavajalik.
Kui meil on andmed olemas, käime tsüklina läbi treeningperioodid. Treeningperiood on ainult üks närvivõrgu koolituse voor. Esmalt segame andmeid igal ajajärgul, et tagada juhuslikkus, enne kui koostame minipartiide loendi.
Värskendamise minikomplekti funktsioon, mida käsitletakse allpool, kutsutakse iga minipartii jaoks välja. Testi andmete olemasolul tagastatakse ka testi täpsus.
Kulupõhine abifunktsioon
Enne kui loome tagasi levitamise koodi, töötame kõigepealt välja abifunktsiooni, mida nimetatakse kulutuletiseks. Kui teeme oma väljundkihis vea, näitab seda kulutuletise funktsioon.
See nõuab kahte sisendit: väljundi aktiveerimiste massiivi ja eeldatavate väljundväärtuste y-koordinaate.
Tagasi levitamise funktsioon
Meie praegust aktiveerimisvektorit, aktiveerimist ja ka kõiki teisi aktiveerimisvektoreid, aktivatsioone ja z-vektoreid, zs, tuleb meeles pidada. Esmalt aktiveeritakse kiht, mida nimetatakse sisendkihiks.
Pärast nende ülespanekut vaatame läbi kõik kalded ja kaalud. Iga tsükkel hõlmab z-vektori arvutamist kaalude ja aktiveerimise punktkorrutisena, selle lisamist zs-i loendisse, aktiveerimise ümberarvutamist ja värskendatud aktiveerimise lisamist aktiveerimiste loendisse.
Lõpuks matemaatika. Delta, mis on võrdne eelmise kihi veaga, mis on korrutatud zs-vektorite viimase elemendi sigmoidse algarvuga, arvutatakse enne tagasikäigu alustamist.
Nabla b viimane kiht on seatud deltaks ja nabla w viimane kiht on määratud delta ja aktivatsioonide viimase kihi punktkorrutis (transponeeritud, et saaksime matemaatikat teha) .
Jätkame nagu varem, alustades teisest kihist ja lõpetades viimasega, ning kordame protsessi pärast viimaste kihtide valmimist. Nablad antakse siis korteegina tagasi.
Mini-partii gradiendi laskumise värskendamine
Meie varasem SGD (stohhastilise gradiendi laskumise) meetod sisaldab mini-partii värskendamist. Kuna seda kasutatakse SGD-s, kuid see nõuab ka backpropi, arutasin, kuhu see funktsioon panna.
Lõpuks otsustasin selle siia postitada. See algab 0 kalde- ja kaaluvektori nablade genereerimisega, täpselt nagu meie backprop-funktsioon tegi.
Selle kahe sisendina on vaja mini-partii ja eta õppimiskiirust. Minipartiis kasutame seejärel funktsiooni backprop, et saada iga nabla massiivi delta iga sisendi x ja väljundi y jaoks. Seejärel värskendatakse nabla loendeid nende deltadega.
Lõpuks kasutame võrgu kaalude ja eelarvamuste värskendamiseks õppimiskiirust ja nablasid. Iga väärtus värskendatakse uusimale väärtusele, millest on lahutatud õppimiskiirus, korrutatakse minipartii suurusega ja lisatakse seejärel nabla väärtusele.
Hinnake funktsiooni
Hindamisfunktsioon on viimane, mille peame kirjutama. Testi andmed on selle funktsiooni ainsaks sisendiks. Selles funktsioonis võrdleme ainult võrgu väljundeid eeldatava tulemusega y. Sisend, x, edasi, määratakse võrgu väljundid.
Täielik kood
Kui kombineerime kogu koodi, näeb see välja selline.
Neuraalvõrgu testimine
MNIST-i andmete laadimine
. MNIST andmed on .pkl.gz-vormingus, mille avame GZIP-iga ja laadime hapukurgiga. Kirjutame kiire meetodi nende andmete laadimiseks kolme suuruse kortmena, mis on jagatud koolitus-, valideerimis- ja testiandmeteks.
Andmete haldamise hõlbustamiseks kirjutame teise funktsiooni, mis kodeerib y 10-üksuse massiivi. Massiivis on kõik nullid, välja arvatud 0, mis vastab pildi õigele numbrile.
Kasutame oma andmete loetavasse vormingusse laadimiseks põhilisi laadimisandmeid ja üht kiirkodeerimismeetodit. Kirjutatakse veel üks funktsioon, mis teisendab meie x väärtused 784 suuruse loendiks, mis sobib pildi 784 piksliga, ja meie y väärtused nende üheks kuumkodeeritud vektorvormiks.
Seejärel ühendame x ja y väärtused nii, et üks indeks sobiks teisega. See kehtib koolituse, valideerimise ja testimise andmekogumite kohta. Seejärel tagastame muudetud andmed.
Jooksukatsed
Teeme uue faili nimega "mnist loader", mis impordib enne testimise alustamist nii meie varem loodud närvivõrgu (lihtne nn) kui ka MNIST-i andmekogumi laadija.
Selles failis on meil vaja ainult andmed importida, luua võrk sisendkihi suurusega 784 ja väljundkihi suurusega 10, käivitada treeningandmetel võrgu SGD-funktsioon ja seejärel testida seda testandmete abil.
Pidage meeles, et meie sisendkihtide loendi puhul pole vahet, milline arv on vahemikus 784 kuni 10. Teisi kihte saame muuta nii, nagu meile meeldib; ainult sisendi ja väljundi suurused on fikseeritud.
Kolm kihti pole vajalikud; võime kasutada nelja, viit või isegi ainult kahte. Nautige sellega katsetamist.
Järeldus
Siin loome Python 3 abil närvivõrgu nullist. Kõrgetasemelise matemaatika kõrval arutasime ka rakendamise spetsiifikat.
Alustasime abifunktsioonide rakendamisega. Neuronite tööks on sigmoidsed ja sigmoidsed põhifunktsioonid üliolulised. Seejärel rakendasime praktikas edasisuunamisfunktsiooni, mis on põhiprotsess andmete edastamiseks närvivõrku.
Järgmisena lõime Pythonis, meie närvivõrku juhtivas mootoris, gradiendi laskumise funktsiooni. Kohalike miinimumide leidmiseks ning nende kaalude ja eelarvamuste optimeerimiseks kasutab meie närvivõrk gradiendi laskumist. Lõime tagasilevitamise funktsiooni kasutades gradient laskumine.
Edastades värskendusi, kui väljundid ei vasta õigetele siltidele, võimaldab see funktsioon närvivõrgul "õppida".
Lõpuks panime oma uhiuue Pythoni Närvivõrgus testida, kasutades MNIST-i andmekogumit. Kõik toimis sujuvalt.
Head kodeerimist!
Jäta vastus