Obsah[Skryť][Šou]
Mozog je porovnateľný s neurónovými sieťami. Toto je analógia, ktorá sa zvyčajne používa na pomoc niekomu novému, aby pochopil myšlienky strojového učenia a umelých neurónových sietí.
Pretože v zákulisí prebieha niekoľko vrstiev matematických a štatistických výpočtov, definovanie týchto sietí ako matematickej funkcie je pokročilejšia metóda.
Toto je pre ľudí, ktorí sa skutočne zaujímajú o strojové učenie a chcú vidieť, ako sa píše kód neurónovej siete v Pythone.
V tomto článku si ukážeme, ako vytvoriť plne prepojenú hlbokú neurónovú sieť (DNN) od nuly Pytón 3.
Prehľad štruktúry súboru pre náš kód neurónovej siete Python
Tu sa vytvoria tri súbory. Prvým je jednoduchý súbor nn.py, o ktorom sa bude diskutovať v častiach „Nastavenie funkcií pomocníka“ a „Vybudovanie neurónovej siete od nuly“.
Budeme mať tiež súbor s názvom mnist loader.py na načítanie testovacích údajov, ako je popísané v časti „Načítanie údajov MNIST“.
Nakoniec budeme mať súbor s názvom test.py, ktorý sa spustí v termináli na testovanie našej neurónovej siete.
Tento súbor je podrobne popísaný v časti „Running Tests“.
inštalácia
Aby ste mohli postupovať podľa tohto návodu, musíte si stiahnuť knižnicu NumPy Python. Môžete to dosiahnuť pomocou nasledujúceho príkazu na termináli:
Import modulov a nastavenie funkcie Pomocník
Jediné dve knižnice, ktoré požadujeme, sú náhodné a NumPy, ktoré hneď importujeme. Pre počiatočné váhy našej neurónovej siete ich zamiešame pomocou náhodnej knižnice.
Aby sme urýchlili naše výpočty, použijeme NumPy alebo np (podľa konvencie sa často importuje ako np). Naše dve pomocné funkcie budú vykonané po našom importe. Dve sigmoidné funkcie: jedna a sigmoidné prvočíslo.
Logistická regresia bude klasifikovať údaje pomocou sigmoidnej funkcie, zatiaľ čo spätná propagácia vypočíta deltu alebo gradient pomocou sigmoidnej primárnej funkcie.
Vytvorenie triedy siete
Budovanie plne prepojenej neurónovej siete je jediným zameraním tejto časti. Trieda siete bude zahŕňať všetky funkcie, ktoré budú nasledovať. Funkcia Object() { [native code] } bude pôvodne vytvorená v našej triede siete.
Funkcia Object() { [native code] } vyžaduje jeden argument, veľkosti. Premenná veľkosti je súborom číselných hodnôt, ktoré predstavujú počet vstupných uzlov prítomných v každej vrstve našej neurónovej siete.
V našej metóde __init__ inicializujeme štyri vlastnosti. Vstupné premenné veľkosti slúžia na nastavenie zoznamu veľkostí vrstiev a počtu vrstiev, resp. počtu vrstiev.
Prvým krokom je náhodné priradenie počiatočných skreslení našej siete každej vrstve, ktorá nasleduje po vstupnej vrstve.
Nakoniec, každé prepojenie medzi vstupnou a výstupnou vrstvou má svoje váhy náhodne generované. Np.Random.Randn() poskytuje náhodnú vzorku získanú z normálneho rozdelenia pre kontext.
Funkcia posunu dopredu
V neurónovej sieti sa informácie posielajú dopredu doprednou funkciou. Táto funkcia bude vyžadovať jeden argument, a označujúci aktuálny aktivačný vektor.
Táto funkcia odhaduje aktivácie na každej vrstve iteráciou cez všetky odchýlky a váhy v sieti. Odpoveďou je predpoveď, ktorou sú aktivácie poslednej vrstvy.
Mini-dávkový gradientný zostup
Ťažným koňom našej triedy Network je Gradient Descent. V tejto verzii používame mini-dávkový (stochastický) gradientový zostup, modifikovanú variáciu gradientového zostupu.
To znamená, že na aktualizáciu nášho modelu sa použije malá dávka údajových bodov. Do tejto metódy sú odovzdané štyri povinné a jeden voliteľný argument. Štyri požadované premenné sú súbor trénovacích údajov, počet epoch, veľkosť mini-dávok a rýchlosť učenia (eta).
Testovacie údaje sú k dispozícii na vyžiadanie. Testovacie údaje poskytneme, keď túto sieť nakoniec vyhodnotíme. Počet vzoriek v tejto funkcii sa na začiatku nastaví na dĺžku zoznamu po transformácii trénovacích údajov na typ zoznamu.
Rovnaký proces používame aj na testovanie údajov, ktoré sú uvedené. Je to preto, že namiesto toho, aby sa nám vrátili ako zoznamy, sú to skutočne zipsy zoznamov. Keď neskôr načítame vzorky údajov MNIST, dozvieme sa o tom viac.
Ak sa môžeme uistiť, že poskytujeme oba druhy údajov ako zoznamy, potom toto typové obsadenie nie je nevyhnutne nevyhnutné.
Akonáhle máme údaje, prejdeme si tréningové epochy v slučke. Tréningové obdobie je len jedno kolo tréningu neurónovej siete. Údaje v každej epoche najprv premiešame, aby sme zaistili náhodnosť pred vytvorením zoznamu mini-dávok.
Funkcia aktualizácie mini-dávky, o ktorej sa hovorí nižšie, sa bude volať pre každú mini-dávku. Ak sú k dispozícii údaje o teste, vráti sa aj presnosť testu.
Nákladovo odvodená pomocná funkcia
Najprv vyviňme pomocnú funkciu nazývanú derivácia nákladov, než skutočne vytvoríme kód spätného šírenia. Ak urobíme chybu v našej výstupnej vrstve, funkcia odvodenia nákladov to ukáže.
Vyžaduje dva vstupy: pole aktivácií výstupov a y-ové súradnice očakávaných výstupných hodnôt.
Funkcia spätného šírenia
Náš súčasný aktivačný vektor, aktivácia, ako aj akékoľvek iné aktivačné vektory, aktivácie a z-vektory, zs, musia byť zachované. Ako prvá sa aktivuje vrstva nazývaná vstupná vrstva.
Po umiestnení prejdeme cez každú odchýlku a váhu. Každá slučka zahŕňa výpočet vektora z ako bodového súčinu váh a aktivácie, jeho pridanie do zoznamu zs, prepočítanie aktivácie a pridanie aktualizovanej aktivácie do zoznamu aktivácií.
Nakoniec matematika. Delta, ktorá sa rovná chybe z predchádzajúcej vrstvy vynásobenej sigmoidným prvočíslom posledného prvku vektorov zs, sa vypočíta predtým, ako začneme spätný prechod.
Posledná vrstva nabla b je nastavená ako delta a posledná vrstva nabla w je nastavená ako bodový súčin delty a predposlednej vrstvy aktivácií (transponované, aby sme mohli skutočne počítať) .
Postupujeme ako predtým, začíname druhou vrstvou a končíme poslednou a po dokončení týchto posledných vrstiev postup opakujeme. Náblas sú potom vrátené ako n-tica.
Aktualizuje sa mini-dávkový gradient zostupu
Naša metóda SGD (stochastický gradient zostup) z predchádzajúceho obdobia zahŕňa mini-dávkovú aktualizáciu. Keďže sa používa v SGD, ale vyžaduje aj backprop, diskutoval som, kam umiestniť túto funkciu.
Nakoniec som sa rozhodol zverejniť to tu. Začína sa vygenerovaním 0 vektorov nablas predsudkov a váh, rovnako ako to urobila naša funkcia backprop.
Vyžaduje mini-dávku a rýchlosť učenia eta ako dva vstupy. V mini-dávke potom použijeme funkciu backprop na získanie delta každého poľa nabla pre každý vstup x a výstup y. Zoznamy nabla sa potom aktualizujú o tieto delty.
Nakoniec používame rýchlosť učenia a nablas na aktualizáciu váh a skreslení siete. Každá hodnota sa aktualizuje na najnovšiu hodnotu zníženú o rýchlosť učenia, vynásobí sa veľkosťou minidávky a potom sa pridá k hodnote nabla.
Hodnotiť funkciu
Funkcia vyhodnotenia je posledná, ktorú musíme napísať. Testovacie údaje sú jediným vstupom pre túto funkciu. V tejto funkcii porovnávame len výstupy siete s predpokladaným výsledkom, y. Napájaním vstupu x dopredu sa určujú výstupy siete.
Kompletný kód
Keď skombinujeme celý kód, vyzerá to takto.
Testovanie neurónovej siete
Načítavajú sa údaje MNIST
údaje MNIST je vo formáte .pkl.gz, ktorý otvoríme pomocou GZIP a načítame uhorkou. Napíšme rýchlu metódu na načítanie týchto údajov ako n-ticu veľkosti tri, rozdelené na trénovacie, validačné a testovacie údaje.
Aby sme uľahčili správu našich údajov, napíšeme ďalšiu funkciu na zakódovanie y do poľa s 10 položkami. Pole bude mať všetky 0 okrem 1, ktorá zodpovedá správnej číslici obrázka.
Na načítanie údajov do čitateľného formátu použijeme základné načítanie údajov a jednu metódu rýchleho kódovania. Napíše sa ďalšia funkcia, ktorá prevedie naše hodnoty x na zoznam s veľkosťou 784, ktorý sa zhoduje s 784 pixelmi obrázka, a naše hodnoty y do ich jedinej vektorovej formy zakódovanej za tepla.
Potom skombinujeme hodnoty x a y tak, aby sa jeden index zhodoval s druhým. Týka sa to súborov údajov školenia, overovania a testovania. Potom vrátime zmenené údaje.
Beh testov
Pred začatím testovania vytvoríme nový súbor s názvom „mnist loader“, ktorý bude importovať neurónovú sieť, ktorú sme vytvorili predtým (jednoduché nn), ako aj zavádzač súboru údajov MNIST.
V tomto súbore všetko, čo musíme urobiť, je importovať údaje, vytvoriť sieť s veľkosťou vstupnej vrstvy 784 a výstupnou vrstvou 10, spustiť funkciu SGD siete na trénovacích údajoch a potom ju otestovať pomocou testovacích údajov.
Majte na pamäti, že v našom zozname vstupných vrstiev nezáleží na tom, aké čísla sú medzi 784 a 10. Ostatné vrstvy môžeme meniť ľubovoľným spôsobom; len veľkosť vstupu a výstupu je pevná.
Tri vrstvy nie sú potrebné; mohli by sme použiť štyri, päť alebo dokonca len dva. Bavte sa s tým experimentovať.
záver
Tu pomocou Pythonu 3 vytvoríme neurónovú sieť od začiatku. Spolu s matematikou na vysokej úrovni sme diskutovali aj o špecifikách implementácie.
Začali sme implementáciou pomocných funkcií. Aby neuróny fungovali, hlavné funkcie sigmatu a sigmy sú kľúčové. Potom zavedieme do praxe funkciu dopredu, čo je základný proces dodávania údajov do neurónovej siete.
Ďalej sme vytvorili funkciu gradientového zostupu v Pythone, motore, ktorý poháňa našu neurónovú sieť. Aby sme našli „miestne minimá“ a optimalizovali ich váhy a odchýlky, naša neurónová sieť používa gradientný zostup. Funkciu backpropagation sme vytvorili pomocou gradientný zostup.
Doručovaním aktualizácií, keď výstupy nezodpovedajú správnym štítkom, táto funkcia umožňuje neurónovej sieti „učiť sa“.
Nakoniec sme vložili náš úplne nový Python neurónové sieť na test pomocou súboru údajov MNIST. Všetko fungovalo hladko.
Šťastné kódovanie!
Nechaj odpoveď