Sisällysluettelo[Piilottaa][Näytä]
Aivot ovat verrattavissa hermoverkkoihin. Tämä on analogia, jota tyypillisesti käytetään auttamaan aloittelijaa ymmärtämään koneoppimisen ja keinotekoisten hermoverkkojen taustalla olevia ideoita.
Koska kulissien takana tapahtuu useita matemaattisia ja tilastollisia laskelmia, näiden verkkojen määrittäminen matemaattisiksi funktioiksi on edistyneempi menetelmä.
Tämä on tarkoitettu ihmisille, jotka ovat todella kiinnostuneita koneoppimisesta ja haluavat nähdä, kuinka Python-hermoverkkokoodi kirjoitetaan.
Tässä artikkelissa osoitamme kuinka rakentaa täysin yhdistetty syvä hermoverkko (DNN) tyhjästä. Python 3.
Yleiskatsaus Python-hermoverkkokoodimme tiedostorakenteeseen
Täällä luodaan kolme tiedostoa. Ensimmäinen on yksinkertainen nn.py-tiedosto, jota käsitellään kohdissa "Aputoimintojen määrittäminen" ja "Neuraaliverkon rakentaminen tyhjästä".
Meillä on myös tiedosto nimeltä mnist loader.py testitietojen lataamiseksi, kuten kohdassa "MNIST-tietojen lataaminen" on kuvattu.
Lopuksi meillä on tiedosto nimeltä test.py, joka käynnistetään päätelaitteessa hermoverkkomme testaamiseksi.
Tämä tiedosto on kuvattu yksityiskohtaisesti kohdassa "Testien suorittaminen".
Asennus
NumPy Python -kirjasto on ladattava, jotta voit seurata tätä opetusohjelmaa. Voit suorittaa tämän käyttämällä seuraavaa komentoa terminaalissa:
Moduulien tuonti ja Helper-toiminnon määrittäminen
Ainoat kaksi tarvitsemamme kirjastoa ovat satunnainen ja NumPy, jotka tuomme heti. Neuraaliverkkomme alkupainotuksissa sekoitetaan ne satunnaisen kirjaston avulla.
Laskennan nopeuttamiseksi käytämme NumPy:tä tai np:tä (sopimuksen mukaan se tuodaan usein nimellä np). Kaksi aputoimintoamme tehdään tuontimme jälkeen. Kaksi sigmoidifunktiota: yksi ja sigmoidinen alkuluku.
Logistinen regressio luokittelee tiedot käyttämällä sigmoidifunktiota, kun taas backpropagation laskee deltan tai gradientin käyttämällä sigmoidialkufunktiota.
Verkkoluokan luominen
Täysin linkitetyn hermoverkon rakentaminen on tämän osion ainoa painopiste. Verkkoluokka kattaa kaikki sen jälkeen tulevat toiminnot. Funktio Object() { [natiivikoodi] } luodaan aluksi verkkoluokkaamme.
Funktio Object() { [natiivikoodi] } vaatii yhden argumentin, sizes. Kokomuuttuja on kokoelma numeerisia arvoja, jotka edustavat hermoverkkomme kussakin kerroksessa olevien syöttösolmujen määrää.
Alustamme neljä ominaisuutta __init__-menetelmässämme. Syöttömuuttujia, koot, käytetään määrittämään tasokokoluettelo ja kerrosten lukumäärä, tasojen lukumäärä, vastaavasti.
Ensimmäinen askel on määrittää satunnaisesti verkkomme alkuperäiset poikkeamat jokaiselle kerrokselle, joka seuraa syöttökerrosta.
Lopuksi jokaisella syöttö- ja lähtökerroksen välisellä linkillä on satunnaisesti generoitu painonsa. Np.Random.Randn() antaa satunnaisotoksen, joka on otettu kontekstin normaalijakaumasta.
Eteenpäinsyöttötoiminto
Neuraaliverkossa informaatio lähetetään eteenpäin syöttöfunktiolla. Tämä funktio tarvitsee yhden argumentin, a, joka osoittaa nykyisen aktivointivektorin.
Tämä funktio arvioi aktivaatiot kussakin kerroksessa iteroimalla kaikkia verkon harhoja ja painotuksia. Annettu vastaus on ennuste, joka on viimeisen kerroksen aktivaatiot.
Mini-erä Gradient Descent
Verkkoluokkamme työhevonen on Gradient Descent. Tässä versiossa käytämme mini-erä (stokastista) gradienttilaskua, gradientin laskeutumisen modifioitua muunnelmaa.
Tämä osoittaa, että mallimme päivittämiseen käytetään pientä erää datapisteitä. Tälle menetelmälle välitetään neljä pakollista ja yksi valinnainen argumentti. Neljä vaadittua muuttujaa ovat harjoitustietojoukko, aikakausien lukumäärä, minierien koko ja oppimisnopeus (eta).
Testitiedot ovat saatavilla pyynnöstä. Toimitamme testitiedot, kun lopulta arvioimme tämän verkon. Tämän toiminnon näytteiden määrä asetetaan aluksi luettelon pituudeksi, kun opetusdata on muutettu luettelotyypiksi.
Käytämme samaa prosessia myös annettujen tietojen testaamiseen. Tämä johtuu siitä, että sen sijaan, että ne palautettaisiin meille luetteloina, ne ovat todellakin luetteloiden zip-tiedostoja. Kun lataamme MNIST-tietonäytteet myöhemmin, opimme tästä lisää.
Jos voimme varmistaa, että tarjoamme molempia tietoja luetteloina, tämä tyyppivalu ei välttämättä ole välttämätöntä.
Kun meillä on tiedot, käymme harjoitusjaksot läpi silmukassa. Harjoittelujakso on vain yksi neuroverkkokoulutuskierros. Sekoitamme ensin tiedot kullakin aikakaudella varmistaaksemme satunnaisuuden, ennen kuin laadimme luettelon mini-eristä.
Päivitysminierätoiminto, jota käsitellään alla, kutsutaan jokaiselle minierälle. Testin tarkkuus palautetaan myös, jos testitiedot ovat saatavilla.
Kustannusjohdannainen aputoiminto
Kehitetään ensin apufunktio, jota kutsutaan kustannusjohdannaiseksi, ennen kuin todella luodaan backpropagation koodi. Jos teemme virheen tuloskerroksessamme, kustannusjohdannainen funktio näyttää sen.
Se vaatii kaksi tuloa: lähtöaktivointien ryhmä ja odotettujen lähtöarvojen y-koordinaatit.
Takaisin etenemistoiminto
Nykyinen aktivointivektorimme, aktivaatio sekä kaikki muut aktivaatiovektorit, aktivaatiot ja z-vektorit, zs, on pidettävä mielessä. Ensin aktivoidaan kerros, jota kutsutaan syöttökerrokseksi.
Käymme läpi jokaisen poikkeaman ja painon niiden asettamisen jälkeen. Jokaisessa silmukassa lasketaan z-vektori painojen ja aktivoinnin pistetulona, lisätään se zs-luetteloon, lasketaan aktivointi uudelleen ja lisätään päivitetty aktivointi aktivointiluetteloon.
Lopuksi matematiikka. Delta, joka on yhtä suuri kuin edellisen kerroksen virhe kerrottuna zs-vektoreiden viimeisen alkion sigmoidisella alkuluvulla, lasketaan ennen kuin aloitamme takaperin.
Viimeinen nabla b:n kerros on asetettu deltaksi ja nabla w:n viimeinen kerros delta- ja aktivointien toiseksi viimeiseksi pistetuloksi (transponoitu, jotta voimme todella tehdä laskennan) .
Jatkamme kuten aiemmin aloittaen toisesta kerroksesta ja päättämällä viimeiseen, ja toistamme prosessin näiden viimeisten kerrosten valmistumisen jälkeen. Nablat annetaan sitten takaisin tuplena.
Päivitetään mini-erän gradienttilaskua
Aikaisempi SGD (stochastic gradient descent) -menetelmämme sisältää mini-eräpäivityksen. Koska sitä käytetään SGD:ssä, mutta se vaatii myös backpropin, pohdin mihin tämän toiminnon laittaisin.
Lopulta päätin julkaista sen täällä. Se alkaa generoimalla 0 vektoreita biasojen ja painojen nablasista, aivan kuten backprop-funktiomme teki.
Se vaatii mini-erän ja eta-oppimisnopeuden kahtena tulona. Mini-erässä käytämme sitten backprop-funktiota saadaksemme kunkin nabla-taulukon delta-arvon jokaiselle tulolle x ja lähdölle y. Nabla-listat päivitetään sitten näillä deltailla.
Lopuksi käytämme oppimisnopeutta ja nablasia verkon painojen ja harhojen päivittämiseen. Jokainen arvo päivitetään uusimpaan arvoon, josta vähennetään oppimisnopeus, kerrotaan minierän koolla ja lisätään sitten nabla-arvoon.
Arvioi toiminto
Arviointifunktio on viimeinen, joka meidän on kirjoitettava. Testitiedot ovat tämän toiminnon ainoa syöte. Tässä funktiossa verrataan vain verkon lähtöjä odotettuun tulokseen y. Syöttämällä tuloa x eteenpäin määritetään verkon lähdöt.
Täydellinen koodi
Kun yhdistämme kaikki koodit, se näyttää tältä.
Neuraaliverkon testaus
Ladataan MNIST-tietoja
- MNIST-tiedot on .pkl.gz-muodossa, jonka avaamme GZIP:llä ja lataamme suolakurkkua. Kirjoitetaan nopea tapa ladata nämä tiedot kolmena koona, joka on jaettu koulutus-, validointi- ja testitietoihin.
Jotta tietomme olisi helpompi hallita, kirjoitamme toisen funktion, joka koodaa y:n 10 kohteen taulukkoon. Taulukko on kaikki nollia paitsi 0, joka vastaa kuvan oikeaa numeroa.
Käytämme peruslataustietoja ja yhtä hot encode -menetelmää tietojen lataamiseen luettavaan muotoon. Toinen funktio kirjoitetaan, joka muuntaa x-arvomme 784-koon listaksi, joka vastaa kuvan 784 pikseliä, ja y-arvomme niiden yhdeksi kuumakoodatuksi vektorimuodoksi.
Sitten yhdistetään x- ja y-arvot siten, että yksi indeksi vastaa toista. Tämä koskee koulutus-, validointi- ja testitietosarjoja. Palautamme sitten muuttuneet tiedot.
Käynnissä olevat testit
Teemme uuden tiedoston nimeltä "mnist loader", joka tuo sekä aiemmin luomamme hermoverkon (yksinkertainen nn) että MNIST-tietojoukon latausohjelman ennen testauksen aloittamista.
Tässä tiedostossa meidän tarvitsee vain tuoda tiedot, rakentaa verkko, jonka syöttökerroksen koko on 784 ja lähtökerroksen koko 10, suorittaa verkon SGD-toiminto harjoitustiedoilla ja testata sitä sitten testitiedoilla.
Muista, että syötekerrosluettelossamme ei ole väliä mitkä numerot ovat välillä 784 ja 10. Voimme muuttaa muita kerroksia haluamallamme tavalla; vain tulo- ja lähtökoot ovat kiinteät.
Kolmea kerrosta ei tarvita; voimme käyttää neljää, viittä tai jopa vain kahta. Pidä hauskaa kokeilemalla sitä.
Yhteenveto
Täällä, Python 3:lla, luomme hermoverkon tyhjästä. Korkean tason matematiikan ohella keskustelimme myös toteutuksen yksityiskohdista.
Aloitimme ottamalla käyttöön aputoimintoja. Jotta neuronit toimisivat, sigmoidi- ja sigmoidiprime-toiminnot ovat ratkaisevia. Otimme sitten käyttöön syöttötoiminnon, joka on perusprosessi tiedon syöttämisessä hermoverkkoon.
Seuraavaksi loimme gradienttilaskeutumisfunktion Pythonissa, moottorissa, joka ohjaa hermoverkkoamme. "Paikallisten minimien" paikantamiseksi ja niiden painojen ja harhojen optimoimiseksi hermoverkkomme käyttää gradienttilaskua. Loimme backpropagation-funktion käyttämällä kaltevuus laskeutuminen.
Toimittamalla päivityksiä, kun lähdöt eivät vastaa oikeita tunnisteita, tämä toiminto mahdollistaa hermoverkon "oppimisen".
Lopuksi laitoimme upouuden Pythonimme neuroverkkomallien testiin MNIST-tietojoukon avulla. Kaikki toimi sujuvasti.
Hyvää koodausta!
Jätä vastaus