U ovom ćemo članku naučiti kako integrirati neuronsku mrežu u SBC. Napravit ćemo troslojnu neuronsku mrežu za aproksimaciju funkcije sin(x).
Proces je podijeljen u dva dijela: 1. obuka mreže koja će se raditi na PC-u i; 2. vođenje mreže, što će se obavljati u SBC-u.
Dio 1. Trening neuronske mreže
Za ovaj dio koristit ćemo Jupyter bilježnice, s bibliotekama Keras, Numpy i Pylab.
Korak 1. Uvezite potrebne biblioteke
Korak 2. Kreirajte skup podataka za obuku
Naš skup podataka sastoji se od 10000 slučajnih brojeva u rasponu od 0 – 2*pi kao ulaz X i njihove odgovarajuće sin funkcije kao ulaza Y. Imajte na umu da smo podesili raspon Y u rasponu od 0 do 1.
Korak 3. Napravite neuronsku mrežu
Da bismo stvorili neuronsku mrežu, kreiramo objekt modela i dodamo mu 3 sloja. To se radi putem API-ja koji nudi biblioteka Keras.
Broj neurona bit će 32 za prvi sloj, 32 za srednji sloj i 1 za izlaz.
Koristit ćemo relu i sigmoidnu aktivaciju.
Korišteni optimizator je Adam i funkcija pogreške MSE.
Broj mrežnih parametara je 1153.
Korak 4. Trening
Prilikom treninga, neuronska mreža koristi skup podataka kako bi prilagodila svoje parametre na takav način da se pogreška svede na minimum.
U ovom slučaju, cijeli skup podataka smo prošli kroz mrežu 10 puta, u serijama od 32 uzorka.
Kao što vidimo, na kraju treninga greška je vrlo mala, 2.5e-5.
Korak 5. Provjera
Sada ćemo posljednji put testirati neuronsku mrežu i usporediti je s očekivanim vrijednostima. Kao što se vidi na grafikonu, mreža prilično dobro aproksimira sinusnu funkciju.
Korak 6. Izvezite podatke
Ova funkcija vam omogućuje da izvezete težine neuronske mreže u tekstualnu datoteku i zatim je učitate iz SBC-a.
Dio 2. Izvršenje na SBC
Prije svega, razmotrit ćemo implementaciju neuronske mreže.
Neuronska mreža je podijeljena u 4 klase: Neuralna_Network, Layer, Perceptron i Activation.
Svaka klasa u osnovi ima 1 metodu nazvanu proces koja je zadužena za obavljanje cjelokupnog posla, kao i metode učitavanja i spremanja.
Korištenje električnih romobila ističe aktiviranje klase, implementira linearne, relu, sigmoidne i tanh aktivacijske funkcije.
Korištenje električnih romobila ističe perceptron razred je odgovoran za izvođenje svih množenja. Imajte na umu da je funkcija vektorskog množenja implementirana u ASM kako se ne bi žrtvovale performanse.
ASM vs Python implementacija
Vektorsko množenje odgovorno je za veći dio korištenja CPU-a, tako da njegova implementacija na ASM-u omogućuje znatno poboljšanje performansi knjižnice. U ovom primjeru izvodi se jednostavno 100×100 vektorsko množenje. Python implementacija traje 1339 us, dok implementacija ASM traje samo 28 us. To je oko 50x brže uz očuvanje istih izlaznih vrijednosti.
Korištenje električnih romobila ističe sloj razred paralelno grupira nekoliko perceptrona.
Razred Živčana mreža slaže sve mrežne slojeve.
Konačno, možemo pregledati/provjeriti korištenje mreže.
Kopirat ćemo datoteku s ponderima u SBC i izvršiti sljedeći main.py.
Ovaj kod učitava mrežu iz datoteke sine.unn i izračunava sinus od 0.123, a zatim prikazuje vrijednost dobivenu mrežom i realni sinus, kao i vrijeme izračuna u mikrosekundama.
Izlaz:
Kao što vidimo, izlaz aproksimira očekivanu vrijednost s 4 decimale.
Ova mreža, s 1153 pondera, zahtijevala je 4612 (1153*4) bajta RAM-a za pohranu pondera u float vrijednosti i 5.8 ms za obradu.