Efnisyfirlit[Fela][Sýna]
Heilinn er sambærilegur við taugakerfi. Þetta er líkingin sem venjulega er notuð til að aðstoða einhvern sem er nýr í viðfangsefninu til að skilja hugmyndirnar á bak við vélanám og gervi taugakerfi.
Vegna þess að það eru nokkur lög af stærðfræðilegum og tölfræðilegum útreikningum í gangi á bak við tjöldin, er það fullkomnari aðferð að skilgreina þessi net sem stærðfræðilega aðgerð.
Þetta er fyrir fólk sem hefur í raun áhuga á vélanámi og vill sjá hvernig Python taugakerfiskóði er skrifaður.
Í þessari grein munum við sýna fram á hvernig á að smíða fulltengt djúpt tauganet (DNN) frá grunni í Python 3.
Yfirlit yfir skráarskipulagið fyrir Python taugakerfiskóðann okkar
Það verða þrjár skrár búnar til hér. Sú fyrsta er einfalda nn.py skráin, sem fjallað verður um í „Setja upp hjálparaðgerðir“ og „Að byggja upp tauganetið frá grunni“.
Við munum einnig hafa skrá sem heitir mnist loader.py til að hlaða prófunargögnunum, eins og lýst er í „Hleður MNIST gögnum“.
Að lokum munum við hafa skrá sem heitir test.py sem verður opnuð í flugstöðinni til að prófa taugakerfi okkar.
Þessari skrá er lýst í smáatriðum í „Running Tests“.
uppsetning
NumPy Python bókasafnið verður að vera hlaðið niður til að fylgja þessari kennslu. Þú getur náð þessu með því að nota eftirfarandi skipun á flugstöðinni:
Flytja inn einingar og setja upp hjálparaðgerðina
Einu tvö söfnin sem við þurfum eru handahófi og NumPy, sem við munum flytja inn strax. Fyrir upphafsþyngd tauganetsins okkar munum við stokka þær upp með því að nota handahófskennda bókasafnið.
Til þess að flýta fyrir útreikningum okkar, munum við nota NumPy eða np (samkvæmt hefð er það oft flutt inn sem np). Tvær hjálparaðgerðir okkar verða gerðar eftir innflutning okkar. Tvær sigmoid aðgerðir: einn og sigmoid prime.
Logistic regression mun flokka gögn með því að nota sigmoid fallið, en backpropagation mun reikna delta eða halla með sigmoid prime fallinu.
Að búa til netflokk
Að byggja upp fulltengt taugakerfi er eina áherslan í þessum hluta. Netflokkurinn mun ná yfir allar aðgerðir sem koma á eftir. Fallið Object() { [native code] } verður upphaflega búið til í netflokknum okkar.
Ein rök, stærðir, er krafist fyrir fallið Object() { [native code] }. Stærðarbreytan er safn af tölugildum sem tákna fjölda inntakshnúta sem eru til staðar í hverju lagi taugakerfisins okkar.
Við frumstillum fjóra eiginleika í __init__ aðferðinni okkar. Inntaksbreyturnar, stærðir, eru notaðar til að stilla lista yfir lagastærðir og fjölda laga, í sömu röð.
Fyrsta skrefið er að úthluta af handahófi upphaflegu hlutdrægni netkerfisins okkar á hvert lag sem fylgir inntakslaginu.
Að lokum hefur hver hlekkur milli inntaks- og úttakslaga þyngd sína af handahófi. Np.Random.Randn() gefur slembiúrtak sem er dregið úr normaldreifingu fyrir samhengi.
Feed Forward virka
Í tauganeti eru upplýsingar sendar áfram með feedforward aðgerðinni. Ein rök, a, sem gefur til kynna núverandi virkjunarvigur, verður krafist fyrir þessa aðgerð.
Þessi aðgerð metur virkjunina á hverju lagi með því að endurtaka yfir allar hlutdrægni og þyngd netsins. Svarið sem gefið er er spáin, sem er virkjun síðasta lagsins.
Mini-lotu Gradient Descent
Vinnuhestur Network bekksins okkar er Gradient Descent. Í þessari útgáfu notum við smálotu (stochastic) hallafall, breytt afbrigði af hallafalli.
Þetta gefur til kynna að lítill hópur af gagnapunktum verði notaður til að uppfæra líkanið okkar. Fjórar nauðsynlegar og ein valfrjáls rök eru send til þessa aðferð. Fjórar nauðsynlegar breytur eru þjálfunargagnasettið, fjöldi tímabila, stærð smálotanna og námshlutfallið (eta).
Prófunargögn eru fáanleg sé þess óskað. Við munum útvega prófunargögn þegar við metum þetta netkerfi að lokum. Fjöldi sýna í þessari aðgerð er upphaflega stilltur á lengd listans þegar þjálfunargögnum hefur verið breytt í listategund.
Við notum einnig sama ferli til að prófa gögn sem eru gefin inn. Þetta er vegna þess að í stað þess að vera skilað til okkar sem listar, eru þeir í raun rennilásar af listum. Þegar við hleðum MNIST gagnasýnunum síðar, munum við læra meira um þetta.
Ef við getum tryggt að við útvegum báðar tegundir af gögnum sem lista, þá er þessi gerð steypa ekki endilega nauðsynleg.
Þegar við höfum gögnin förum við yfir þjálfunartímabilin í lykkju. Þjálfunartímabil er aðeins ein umferð af tauganetþjálfun. Við stokkum fyrst gögnin á hverju tímabili til að tryggja tilviljun áður en við gerum lista yfir smálotur.
Uppfærslu lítill lotuaðgerðin, sem fjallað er um hér að neðan, verður kölluð fyrir hverja smálotu. Prófnákvæmni verður einnig skilað ef prófunargögn eru tiltæk.
Kostnaðarafleidd hjálparaðgerð
Við skulum þróa hjálparaðgerð sem kallast kostnaðarafleiða fyrst áður en við búum til bakútbreiðslukóðann. Ef við gerum mistök í framleiðslulaginu okkar mun kostnaðarafleiðufallið sýna það.
Það þarf tvö inntak: úttaksvirkjunarfylki og y-hnit væntanlegra úttaksgilda.
Bakútbreiðsluaðgerð
Núverandi virkjunarvigur okkar, virkjun, sem og allir aðrir virkjunarvigrar, virkjunar og z-vektorar, zs, verða allir að hafa í huga. Lag sem kallast inntakslag er virkjað fyrst.
Við förum í gegnum hverja hlutdrægni og þyngd eftir að hafa sett þau upp. Hver lykkja felur í sér að reikna z vektorinn sem punktaafurð lóðanna og virkjunarinnar, bæta honum við listann yfir zs, endurreikna virkjunina og bæta uppfærðri virkjuninni við listann yfir virkjunina.
Að lokum, stærðfræðin. Delta, sem er jöfn skekkju frá fyrra lagi margfaldað með sigmoid frumefni síðasta staks zs vigra, er reiknað áður en við byrjum afturábak.
Síðasta lagið af nabla b er stillt á að vera delta, og síðasta lagið af nabla w er stillt til að vera punktaafurð deltasins og næstsíðasta virkjunarlagið (umfært svo við getum í raun reiknað út) .
Við höldum áfram eins og áður, byrjum á öðru lagi og lýkur með því síðasta, og endurtekið ferlið eftir að hafa lokið þessum síðustu lögum. Nablarnir eru síðan gefnir til baka sem túpel.
Uppfærir Mini-lotu halli niður
SGD (stochastic gradient descent) aðferðin okkar frá því áður inniheldur uppfærslu á litlum lotum. Þar sem það er notað í SGD en krefst líka bakstoðar, var ég að deila um hvar ætti að setja þessa aðgerð.
Að lokum ákvað ég að birta það hér. Það byrjar á því að búa til 0 vektora af nablas hlutdrægni og lóða, alveg eins og bakstoðfall okkar gerði.
Það krefst lítillar lotu og eta námshlutfalls sem tvö inntak þess. Í mini-lotunni notum við síðan backprop aðgerðina til að fá delta hvers nabla fylki fyrir hvert inntak, x, og úttak, y. Nabla listarnir eru síðan uppfærðir með þessum deltas.
Að lokum notum við námshlutfall og nabla til að uppfæra vægi og hlutdrægni netsins. Hvert gildi er uppfært í nýjasta gildið, að frádregnum námshraða, margfaldað með minilotastærðinni og síðan bætt við nabla gildið.
Meta virkni
Meta fallið er það síðasta sem við þurfum að skrifa. Prófunargögnin eru eina inntakið fyrir þessa aðgerð. Í þessari aðgerð berum við aðeins saman úttak netkerfisins við væntanlega niðurstöðu, y. Með því að fæða inntakið, x, áfram, eru úttak netkerfisins ákvörðuð.
Heill kóða
Þegar við sameinum allan kóðann birtist hann svona.
Prófa taugakerfi
Hleður MNIST gögnum
The MNIST gögn er á .pkl.gz sniði, sem við munum opna með GZIP og hlaða með súrum gúrkum. Við skulum skrifa fljótlega aðferð til að hlaða þessum gögnum sem tuple af stærð þrjú, skipt í þjálfunar-, löggildingar- og prófunargögn.
Til að auðvelda umsjón með gögnum okkar munum við skrifa aðra aðgerð til að umrita y í 10 atriði fylki. Fylkingin verður öll 0 nema 1 sem passar við réttan tölustaf myndarinnar.
Við munum nota grunnhleðslugögnin og eina heita kóðaaðferð til að hlaða gögnunum okkar á læsilegt snið. Önnur aðgerð verður skrifuð sem mun umbreyta x-gildum okkar í lista af stærð 784, sem passar við 784 pixla myndarinnar, og y-gildum okkar í sitt eina heitkóðaða vektorform.
Síðan munum við sameina x og y gildin þannig að önnur vísitalan passi við hina. Þetta á við um þjálfunar-, löggildingar- og prófunargagnasöfnin. Við skilum síðan breyttum gögnum.
Hlaupapróf
Við munum búa til nýja skrá sem kallast „mnist loader“ sem mun flytja inn bæði tauganetið sem við stofnuðum áður (einfalt nn) og MNIST gagnasett hleðslutækisins áður en við byrjum að prófa.
Í þessari skrá, allt sem við þurfum að gera er að flytja inn gögnin, byggja upp net með inntakslagastærð 784 og úttakslagastærð 10, keyra SGD virkni netsins á þjálfunargögnunum og prófa þau síðan með því að nota prófunargögnin.
Hafðu í huga að fyrir lista okkar yfir inntakslög skiptir engu máli hvaða tölur eru á milli 784 og 10. Við getum breytt hinum lögum eins og við viljum; bara inntaks- og úttakstærðirnar eru fastar.
Þrjú lög eru ekki nauðsynleg; við gætum notað fjóra, fimm eða jafnvel bara tvo. Gaman að gera tilraunir með það.
Niðurstaða
Hér, með því að nota Python 3, búum við til tauganet frá grunni. Samhliða stærðfræði á háu stigi ræddum við einnig sérkenni innleiðingar.
Við byrjuðum á því að innleiða hjálparaðgerðir. Til að taugafrumurnar virki eru aðalhlutverk sigmoid og sigmoid mikilvæg. Við settum síðan í framkvæmd feedforward aðgerðina, sem er grundvallarferlið til að fæða gögn inn í tauganetið.
Næst bjuggum við til hallafallsfallið í Python, vélinni sem knýr tauganetið okkar. Til þess að finna „staðbundin lágmark“ og hámarka þyngd þeirra og hlutdrægni notar tauganet okkar hallafall. Við bjuggum til bakfjölgunaraðgerðina með því að nota hallandi lækkun.
Með því að skila uppfærslum þegar úttakið passar ekki við viðeigandi merki gerir þessi aðgerð tauganetinu kleift að „læra“.
Að lokum setjum við glænýja Python okkar tauga net til prófunar með því að nota MNIST gagnasettið. Allt virkaði snurðulaust.
Gleðilega kóðun!
Skildu eftir skilaboð