Obsah[Skrýt][Ukázat]
Mozek je srovnatelný s neuronovými sítěmi. Toto je analogie, která se obvykle používá, aby pomohla někomu novému pochopit myšlenky strojového učení a umělých neuronových sítí.
Protože za scénou probíhá několik vrstev matematických a statistických výpočtů, je definování těchto sítí jako matematické funkce pokročilejší metodou.
Toto je pro lidi, kteří se skutečně zajímají o strojové učení a chtějí vidět, jak je napsán kód neuronové sítě v Pythonu.
V tomto článku si ukážeme, jak vytvořit plně propojenou hlubokou neuronovou síť (DNN) od nuly PYTHON 3.
Přehled struktury souboru pro náš kód neuronové sítě v Pythonu
Zde budou vytvořeny tři soubory. Prvním je jednoduchý soubor nn.py, o kterém se bude diskutovat v částech „Nastavení pomocných funkcí“ a „Vytvoření neuronové sítě od nuly“.
K načtení testovacích dat budeme mít také soubor s názvem mnist loader.py, jak je popsáno v části „Načítání dat MNIST“.
Nakonec budeme mít soubor s názvem test.py, který se spustí v terminálu, aby otestoval naši neuronovou síť.
Tento soubor je podrobně popsán v části „Probíhající testy“.
Instalace
Abyste mohli postupovat podle tohoto návodu, musíte si stáhnout knihovnu NumPy Python. Můžete to provést pomocí následujícího příkazu na terminálu:
Import modulů a nastavení funkce Helper
Jediné dvě knihovny, které požadujeme, jsou náhodné a NumPy, které budeme hned importovat. Pro počáteční váhy naší neuronové sítě je zamícháme pomocí náhodné knihovny.
Abychom urychlili naše výpočty, použijeme NumPy nebo np (podle konvence se často importuje jako np). Naše dvě pomocné funkce budou provedeny po našem importu. Dvě sigmoidní funkce: jedna a sigmoidní prvočíslo.
Logistická regrese bude klasifikovat data pomocí sigmoidní funkce, zatímco backpropagation vypočítá deltu nebo gradient pomocí sigmoidní primární funkce.
Vytvoření síťové třídy
Budování plně propojené neuronové sítě je jediným zaměřením této části. Třída network bude zahrnovat všechny funkce, které následují. Funkce Object() { [nativní kód] } bude zpočátku vytvořena v naší síťové třídě.
Funkce Object() { [nativní kód] } vyžaduje jeden argument, velikosti. Proměnná velikosti je sbírka číselných hodnot, které představují počet vstupních uzlů přítomných v každé vrstvě naší neuronové sítě.
V naší metodě __init__ inicializujeme čtyři vlastnosti. Vstupní proměnné velikosti slouží k nastavení seznamu velikostí vrstev a počtu vrstev, resp. počtu vrstev.
Prvním krokem je náhodné přiřazení počátečních zkreslení naší sítě každé vrstvě, která následuje po vstupní vrstvě.
Konečně, každý spoj mezi vstupní a výstupní vrstvou má své váhy náhodně generované. Np.Random.Randn() poskytuje náhodný vzorek vybraný z normálního rozdělení pro kontext.
Funkce Feed Forward
V neuronové síti jsou informace posílány dopředu funkcí dopředné vazby. Tato funkce bude vyžadovat jeden argument, a, udávající aktuální aktivační vektor.
Tato funkce odhaduje aktivace na každé vrstvě iterací přes všechna předpětí a váhy v síti. Danou odpovědí je předpověď, což jsou aktivace poslední vrstvy.
Mini-dávkový gradient sestup
Tahoun naší třídy Network je Gradient Descent. V této verzi používáme minidávkový (stochastický) gradientní sestup, upravenou variaci gradientního sestupu.
To znamená, že k aktualizaci našeho modelu bude použita malá dávka datových bodů. Této metodě jsou předány čtyři povinné a jeden volitelný argument. Čtyři požadované proměnné jsou trénovací datový soubor, počet epoch, velikost mini-dávek a rychlost učení (eta).
Údaje o testech jsou k dispozici na vyžádání. Až tuto síť nakonec vyhodnotíme, dodáme testovací data. Počet vzorků v této funkci je zpočátku nastaven na délku seznamu, jakmile byla trénovací data převedena na typ seznamu.
Stejný proces aplikujeme také na testovací data, která jsou uvedena. Je to proto, že místo toho, aby nám byly vráceny jako seznamy, jsou to skutečně zipy seznamů. Až později načteme vzorky dat MNIST, dozvíme se o tom více.
Pokud se můžeme ujistit, že poskytujeme oba druhy dat jako seznamy, pak toto typové obsazení není nezbytně nutné.
Jakmile máme data, procházíme tréninkové epochy ve smyčce. Tréninkové období je pouze jedno kolo tréninku neuronové sítě. Nejprve zamícháme data v každé epoše, abychom zajistili náhodnost, než vytvoříme seznam mini-dávek.
Pro každou mini-dávku bude volána funkce aktualizace mini-dávky, která je popsána níže. Přesnost testu bude také vrácena, pokud jsou k dispozici testovací data.
Nákladově odvozená pomocná funkce
Nejprve vyvineme pomocnou funkci nazvanou derivace nákladů, než skutečně vytvoříme kód backpropagation. Pokud uděláme chybu v naší výstupní vrstvě, ukáže to funkce derivace nákladů.
Vyžaduje dva vstupy: pole aktivace výstupu a souřadnice y očekávaných výstupních hodnot.
Funkce zpětného šíření
Náš současný aktivační vektor, aktivace, stejně jako jakékoli další aktivační vektory, aktivace a z-vektory, zs, všechny musíme mít na paměti. Nejprve se aktivuje vrstva zvaná vstupní vrstva.
Poté, co je postavíme, projdeme každé předpětí a váhu. Každá smyčka zahrnuje výpočet vektoru z jako bodového součinu vah a aktivace, jeho přidání do seznamu zs, přepočet aktivace a přidání aktualizované aktivace do seznamu aktivací.
Nakonec matematika. Delta, která se rovná chybě z předchozí vrstvy vynásobené esovitým prvočíslem posledního prvku vektorů zs, se vypočítá předtím, než začneme náš zpětný průchod.
Poslední vrstva nabla b je nastavena jako delta a poslední vrstva nabla w je nastavena jako bodový součin delty a předposlední vrstvy aktivací (transponované, abychom mohli skutečně počítat) .
Postupujeme jako dříve, začínáme druhou vrstvou a končíme poslední a po dokončení těchto posledních vrstev postup opakujeme. Náblas jsou pak vráceni jako n-tice.
Aktualizace sestupu s minidávkou
Naše metoda SGD (stochastic gradient sestup) z dřívějška zahrnuje mini-dávkovou aktualizaci. Protože se používá v SGD, ale také vyžaduje backprop, přemýšlel jsem, kam tuto funkci umístit.
Nakonec jsem se rozhodl to sem zveřejnit. Začíná generováním 0 vektorů nablas biases a vah, stejně jako naše backprop funkce.
Vyžaduje mini-dávku a rychlost učení eta jako své dva vstupy. V minidávce pak použijeme funkci backprop k získání delta každého pole nabla pro každý vstup x a výstup y. Seznamy nabla jsou pak aktualizovány o tyto delty.
Nakonec používáme rychlost učení a nablas k aktualizaci vah a zkreslení sítě. Každá hodnota je aktualizována na nejnovější hodnotu, sníženou o rychlost učení, vynásobená velikostí minidávky a poté přidána k hodnotě nabla.
Vyhodnotit funkci
Funkce vyhodnocení je poslední, kterou musíme napsat. Testovací data jsou jediným vstupem pro tuto funkci. V této funkci porovnáváme pouze výstupy sítě s předpokládaným výsledkem y. Napájením vstupu x vpřed jsou určeny výstupy sítě.
Kompletní kód
Když zkombinujeme celý kód, vypadá to takto.
Testování neuronové sítě
Načítání dat MNIST
Projekt údaje MNIST je ve formátu .pkl.gz, který otevřeme pomocí GZIP a načteme nálevem. Pojďme napsat rychlou metodu, jak tato data načíst jako n-tici velikosti tři, rozdělenou na trénovací, validační a testovací data.
Abychom usnadnili správu našich dat, napíšeme další funkci pro zakódování y do pole o 10 položkách. Pole bude mít všechny 0 kromě 1, která odpovídá správné číslici obrázku.
K načtení dat do čitelného formátu použijeme základní načtení dat a jednu metodu horkého kódování. Bude napsána další funkce, která převede naše hodnoty x na seznam o velikosti 784, odpovídající 784 pixelům obrázku, a naše hodnoty y do jejich jediné horké zakódované vektorové formy.
Potom zkombinujeme hodnoty x a y tak, aby jeden index odpovídal druhému. To platí pro tréninkové, validační a testovací datové sady. Poté vrátíme změněná data.
Průběžné testy
Než začneme s testováním, vytvoříme nový soubor s názvem „mnist loader“, který bude importovat jak neuronovou síť, kterou jsme vytvořili dříve (jednoduché nn), tak zavaděč datové sady MNIST.
V tomto souboru vše, co musíme udělat, je importovat data, vytvořit síť s velikostí vstupní vrstvy 784 a výstupní vrstvou 10, spustit funkci SGD sítě na trénovacích datech a poté ji otestovat pomocí testovacích dat.
Mějte na paměti, že pro náš seznam vstupních vrstev nezáleží na tom, která čísla jsou mezi 784 a 10. Ostatní vrstvy můžeme libovolně měnit; pouze vstupní a výstupní velikosti jsou pevné.
Tři vrstvy nejsou nutné; mohli bychom použít čtyři, pět nebo dokonce jen dva. Bavte se s tím experimentovat.
Proč investovat do čističky vzduchu?
Zde pomocí Pythonu 3 vytvoříme neuronovou síť od nuly. Spolu s matematikou na vysoké úrovni jsme diskutovali také o specifikách implementace.
Začali jsme implementací pomocných funkcí. Aby neurony fungovaly, jsou klíčové primární funkce sigmatu a sigmatu. Poté jsme uvedli do praxe funkci dopředné vazby, což je základní proces pro dodávání dat do neuronové sítě.
Dále jsme vytvořili funkci gradientního sestupu v Pythonu, enginu, který pohání naši neuronovou síť. Abychom lokalizovali „místní minima“ a optimalizovali jejich váhy a odchylky, naše neuronová síť používá gradientní sestup. Funkci backpropagation jsme vytvořili pomocí gradientní sestup.
Doručováním aktualizací, když výstupy neodpovídají správným štítkům, tato funkce umožňuje neuronové síti „učit se“.
Nakonec jsme vložili náš zbrusu nový Python nervová síť k testu pomocí datové sady MNIST. Vše fungovalo hladce.
Šťastné kódování!
Napsat komentář