In diesem Artikel erfahren Sie, wie Sie ein neuronales Netzwerk in die integrieren SBC. Wir werden ein dreischichtiges neuronales Netzwerk erstellen, um die Funktion sin(x) zu approximieren.
Der Prozess gliedert sich in zwei Teile: 1. Training des Netzwerks, das auf dem PC durchgeführt wird; 2. Ausführen des Netzwerks, was im SBC durchgeführt wird.
Teil 1. Training für neuronale Netze
Für diesen Teil verwenden wir Jupyter-Notebooks mit den Keras-, Numpy- und Pylab-Bibliotheken.
Schritt 1. Importieren Sie die erforderlichen Bibliotheken
Schritt 2. Erstellen Sie das Trainings-Dataset
Unser Datensatz besteht aus 10000 Zufallszahlen im Bereich 0 – 2*pi als Eingabe X und ihrer entsprechenden Sinusfunktion als Eingabe Y. Beachten Sie, dass wir den Bereich von Y auf einen Bereich von 0 bis 1 angepasst haben.
Schritt 3. Erstellen Sie das neuronale Netzwerk
Um das neuronale Netzwerk zu erstellen, erstellen wir ein Modellobjekt und fügen ihm 3 Schichten hinzu. Dies erfolgt über die von der Keras-Bibliothek bereitgestellte API.
Die Anzahl der Neuronen beträgt 32 für die erste Schicht, 32 für die mittlere Schicht und 1 für die Ausgabe.
Wir werden die Relu- und Sigmoid-Aktivierungen verwenden.
Der verwendete Optimierer ist Adam und die Fehlerfunktion MSE.
Die Anzahl der Netzwerkparameter beträgt 1153.
Schritt 4. Training
Beim Training passt das neuronale Netz anhand des Datensatzes seine Parameter so an, dass der Fehler minimiert wird.
In diesem Fall haben wir den gesamten Datensatz zehnmal in Stapeln mit 10 Proben durch das Netzwerk geleitet.
Wie wir sehen können, ist der Fehler am Ende des Trainings sehr klein, 2.5e-5.
Schritt 5. Überprüfung
Jetzt testen wir das neuronale Netz ein letztes Mal und vergleichen es mit den erwarteten Werten. Wie in der Grafik zu sehen ist, approximiert das Netzwerk die Sinusfunktion ziemlich gut.
Schritt 6. Exportieren Sie die Daten
Mit dieser Funktion können Sie die Gewichte des neuronalen Netzes in eine Textdatei exportieren und diese dann aus dem SBC laden.
Teil 2. Ausführung auf dem SBC
Zunächst werden wir die Implementierung des neuronalen Netzes überprüfen.
Das neuronale Netz ist in 4 Klassen unterteilt: Neural_Network, Layer, Perceptron und Activation.
Jede Klasse hat im Grunde eine Methode namens process, die für die gesamte Arbeit sowie das Laden und Speichern von Methoden zuständig ist.
Der Aktivierung Klasse, implementiert die Aktivierungsfunktionen linear, relu, sigmoid und tanh.
Der Perceptron Klasse ist für die Durchführung aller Multiplikationen verantwortlich. Beachten Sie, dass die Vektormultiplikationsfunktion in ASM implementiert ist, um die Leistung nicht zu beeinträchtigen.
ASM vs. Python-Implementierung
Die Vektormultiplikation ist für den größten Teil der CPU-Auslastung verantwortlich, sodass die Implementierung auf ASM die Bibliotheksleistung erheblich verbessern kann. In diesem Beispiel wird eine einfache 100×100-Vektormultiplikation durchgeführt. Eine Python-Implementierung benötigt 1339 us, während die ASM-Implementierung nur 28 us benötigt. Dies ist etwa 50-mal schneller, während die gleichen Ausgabewerte beibehalten werden.
Der Schicht Klasse gruppiert einige Perceptrons parallel.
Die Klasse Neurales Netzwerk stapelt alle Netzwerkschichten.
Schließlich können wir die Nutzung des Netzwerks überprüfen/überprüfen.
Wir kopieren die Datei mit den Gewichten auf den SBC und führen die folgende main.py aus.
Dieser Code lädt das Netzwerk aus der Datei sine.unn und berechnet den Sinus von 0.123 und zeigt dann den vom Netzwerk erhaltenen Wert und den echten Sinus sowie die Berechnungszeit in Mikrosekunden an.
Ausgang:
Wie wir sehen, nähert sich die Ausgabe dem erwarteten Wert mit 4 Dezimalstellen an.
Dieses Netzwerk mit 1153 Gewichten benötigte 4612 (1153*4) Bytes RAM, um Gewichte in Float-Werten zu speichern, und 5.8 ms für die Verarbeitung.