W tym artykule dowiemy się, jak zintegrować sieć neuronową w SBC. Stworzymy trójwarstwową sieć neuronową, aby przybliżyć funkcję sin(x).
Proces podzielony jest na dwie części: 1. szkolenie sieci, które zostanie wykonane na komputerze PC oraz; 2. uruchomienie sieci, co zostanie zrobione w SBC.
Część 1. Trening sieci neuronowych
W tej części użyjemy notatników Jupyter, z bibliotekami Keras, Numpy i Pylab.
Krok 1. Zaimportuj potrzebne biblioteki
Krok 2. Utwórz treningowy zbiór danych
Nasz zbiór danych składa się z 10000 liczb losowych z zakresu od 0 do 2*pi na wejściu X i odpowiadającej im funkcji sin na wejściu Y. Zauważ, że dostosowaliśmy zakres Y do zakresu od 0 do 1.
Krok 3. Utwórz sieć neuronową
Aby stworzyć sieć neuronową, tworzymy obiekt modelowy i dodajemy do niego 3 warstwy. Odbywa się to za pośrednictwem interfejsu API dostarczanego przez bibliotekę Keras.
Liczba neuronów będzie wynosić 32 dla pierwszej warstwy, 32 dla warstwy środkowej i 1 dla wyjścia.
Wykorzystamy aktywacje relu i sigmoid.
Użyty optymalizator to Adam i funkcja błędu MSE.
Liczba parametrów sieciowych to 1153.
Krok 4. Trening
Podczas uczenia sieć neuronowa wykorzystuje zbiór danych do dostosowania swoich parametrów w taki sposób, aby zminimalizować błąd.
W tym przypadku przesłaliśmy cały zestaw danych przez sieć 10 razy, w 32-próbkowych partiach.
Jak widać, pod koniec treningu błąd jest bardzo mały, 2.5e-5.
Krok 5. Weryfikacja
Teraz przetestujemy sieć neuronową po raz ostatni i porównamy ją z oczekiwanymi wartościami. Jak widać na wykresie, sieć dość dobrze przybliża funkcję sinus.
Krok 6. Eksportuj dane
Funkcja ta pozwala wyeksportować wagi sieci neuronowej do pliku tekstowego, a następnie załadować je z SBC.
Część 2. Egzekucja na SBC
Przede wszystkim przyjrzymy się implementacji sieci neuronowej.
Sieć neuronowa podzielona jest na 4 klasy: Neural_Network, Layer, Perceptron i Activation.
Każda klasa ma zasadniczo jedną metodę zwaną procesem, która jest odpowiedzialna za wykonanie całej pracy, a także za ładowanie i zapisywanie metod.
Kurs Aktywacja klasy, implementuje funkcje aktywacji liniowej, relu, sigmoidalnej i tanh.
Kurs perceptron klasa odpowiada za wykonanie wszystkich mnożeń. Zauważ, że funkcja mnożenia wektorów jest zaimplementowana w ASM, aby nie tracić wydajności.
Implementacja ASM vs Python
Mnożenie wektorów odpowiada za większość wykorzystania procesora, więc zaimplementowanie go w ASM pozwala znacznie poprawić wydajność biblioteki. W tym przykładzie wykonywane jest proste mnożenie wektora 100×100. Implementacja Pythona zajmuje 1339 nas, podczas gdy implementacja ASM zajmuje tylko 28us. Jest to około 50x szybsze przy zachowaniu tych samych wartości wyjściowych.
Kurs Warstwa klasa grupuje równolegle kilka perceptronów.
Klasa Sieć neuronowa układa wszystkie warstwy sieciowe.
Na koniec możemy przejrzeć/sprawdzić korzystanie z sieci.
Skopiujemy plik z wagami do SBC i wykonamy następujący plik main.py.
Ten kod ładuje sieć z pliku sine.unn i oblicza sinus 0.123, a następnie wyświetla wartość uzyskaną przez sieć i sinus rzeczywisty, a także czas obliczeń w mikrosekundach.
Wydajność:
Jak widać, wynik przybliża oczekiwaną wartość z 4 miejscami po przecinku.
Ta sieć, z 1153 wagami, wymagała 4612 (1153*4) bajtów pamięci RAM do przechowywania wag w wartościach zmiennoprzecinkowych i 5.8 ms do przetworzenia.