V tomto článku se naučíme, jak integrovat neuronovou síť do SBC. Vytvoříme 3-vrstvou neuronovou síť pro aproximaci funkce sin(x).
Proces je rozdělen do dvou částí: 1. trénování sítě, které bude probíhat na PC a; 2. spuštění sítě, což bude provedeno v SBC.
Část 1. Trénink neuronové sítě
Pro tuto část použijeme notebooky Jupyter s knihovnami Keras, Numpy a Pylab.
Krok 1. Importujte potřebné knihovny
Krok 2. Vytvořte trénovací datovou sadu
Naše datová sada se skládá z 10000 0 náhodných čísel v rozsahu 2 – 0*pi jako vstupu X a jejich odpovídající funkce sin jako vstupu Y. Všimněte si, že jsme upravili rozsah Y na rozsah od 1 do XNUMX.
Krok 3. Vytvořte neuronovou síť
Pro vytvoření neuronové sítě vytvoříme objekt modelu a přidáme k němu 3 vrstvy. To se provádí prostřednictvím API poskytované knihovnou Keras.
Počet neuronů bude 32 pro první vrstvu, 32 pro střední vrstvu a 1 pro výstup.
Použijeme aktivace relu a sigmoid.
Použitý optimalizátor je Adam a chybová funkce MSE.
Počet parametrů sítě je 1153.
Krok 4. Školení
Při trénování neuronová síť pomocí datové sady upravuje své parametry tak, aby byla chyba minimalizována.
V tomto případě jsme celou datovou sadu prošli sítí 10krát, v dávkách 32 vzorků.
Jak vidíme, na konci tréninku je chyba velmi malá, 2.5e-5.
Krok 5. Ověření
Nyní neuronovou síť naposledy otestujeme a porovnáme s očekávanými hodnotami. Jak je vidět na grafu, síť aproximuje funkci sinus docela dobře.
Krok 6. Exportujte data
Tato funkce umožňuje exportovat váhy neuronové sítě do textového souboru a následně jej načíst z SBC.
Část 2. Exekuce na SBC
Nejprve si zopakujeme implementaci neuronové sítě.
Neuronová síť je rozdělena do 4 tříd: Neural_Network, Layer, Perceptron a Activation.
Každá třída má v podstatě 1 metodu zvanou proces, která má na starosti veškerou práci a také metody načítání a ukládání.
Jedno Aktivace třída, implementuje lineární, relu, sigmoidní a tanh aktivační funkce.
Jedno perceptron třída je zodpovědná za provedení všech násobení. Všimněte si, že funkce vektorového násobení je implementována v ASM, aby nedošlo k obětování výkonu.
Implementace ASM vs Python
Násobení vektorů je zodpovědné za většinu využití CPU, takže jeho implementace na ASM umožňuje výrazně zlepšit výkon knihovny. V tomto příkladu je provedeno jednoduché vektorové násobení 100×100. Implementace pythonu trvá 1339 us, mezitím implementace ASM trvá pouze 28 us. To je asi 50x rychlejší při zachování stejných výstupních hodnot.
Jedno vrstva třída seskupuje několik perceptronů paralelně.
Třída Nervová síť shromažďuje všechny síťové vrstvy.
Nakonec můžeme zkontrolovat/zkontrolovat použití sítě.
Zkopírujeme soubor s váhami do SBC a provedeme následující main.py.
Tento kód načte síť ze souboru sine.unn a vypočítá sinus 0.123 a poté zobrazí hodnotu získanou sítí a skutečný sinus a také dobu výpočtu v mikrosekundách.
Výstup:
Jak vidíme, výstup se přibližuje očekávané hodnotě na 4 desetinná místa.
Tato síť s 1153 váhami vyžadovala 4612 (1153*4) bajtů RAM pro uložení váh v plovoucí hodnotě a 5.8 ms pro zpracování.