Hallo,
gibt es eine Möglichkeit
1) ein neuronales Netz am PC komfortabel zu entwerfen, zu trainieren und
zu testen
2) und dann das fertige Modell als C-Code zu exportieren, der z.B. für
einen Mikrocontroller kompiliert werden kann
???
Punkt 1 kann man ja z.B. mit Python und Keras einigermaßen gut lösen.
Aber wie man von da zu C-Code kommt ist mir nicht klar. Gibt es ggf.
ganz andere Vorgehensweisen?
NatürlicheDummheit schrieb:> ein neuronales Netz am PC komfortabel zu entwerfen, zu trainieren und> zu testen>> und dann das fertige Modell als C-Code zu exportieren, der z.B. für> einen Mikrocontroller kompiliert werden kann
vorab: ich kenne mich mit neuronalen Netzen fast garnicht aus.
Nach meinem Verständniss ist ein neuronales Netz "ein Haufen von
Algorithmen", und das Ergebniss des Trainings das Modell, und dieses
wird in geeigneten Datenstrukturen abgespeichert. Das können natürlich
auch Algorithmen und Datenstrukturen sein, welche in "C" erstellt worden
sind.
-->
Du suchst also eine Möglichkeit, eine Datenstruktur (dein Modell) vom PC
zu einem Mikrocontroller zu übertragen, wo es dann in "C-gemäßen"
Datenstrukturen vorliegt? (es würde sich anbieten, eine derartige
Datenkonvertierung direkt am PC vorzunehmen)
Oder geht es dir um den Transportweg vom PC zum Mikrocontroller?
Welche Algorithmen willst du denn auf deinem Mikrocontroller als
"KI-Anwendung" laufen lassen? Und wie interagiert diese Anwendung mit
Sensoren und Aktoren in deinem Mikrocontroller-Umfeld?
Was hindert dich denn daran, deine Algorithmen "am PC" ebenfalls in C zu
erstellen, und dann damit dein neuronales Netz "zu entwerfen, zu
trainieren und zu testen"? Dann fällt ja die Portierung auf den
Mikrocontroller "relativ einfach" aus, denn C-Compiler für
Microcontroller sind ja eigentlich "Standard".
Wird der Lernprozess am PC abgeschlossen sein, und der Mikrocontroller
führt nur noch das einmal Erlernte aus? Oder soll "die KI" am
Mikrocontroller ebenfalls aktiv (nach-) lernen können?
> NatürlicheDummheit schrieb:
> Nach meinem Verständniss ist ein neuronales Netz "ein Haufen von
> Algorithmen", und das Ergebniss des Trainings das Modell, und dieses> wird in geeigneten Datenstrukturen abgespeichert. Das können natürlich> auch Algorithmen und Datenstrukturen sein, welche in "C" erstellt worden> sind.
Eher nicht. Ein Neurolales Netz ist in erster Linie eine (große) Matrix
mit sog. "Gewichten" bzw. "Faktoren" (die beim Training entstehen).
Diese werden mit immer den gleichen Algorithmen auf die durchlaufenden
Informationen angewandt, um diese zu spezifizieren.
Ein NN skaliert also primär mit der Anzahl der "Neuronen" und den
zugehörigen Faktoren (und damit dem Speicherbedarf), weniger mit dem
eigentlichen Programmcode.
Frank E. schrieb:> Eher nicht.
Eher doch.
Aus was soll ein Computersystem denn sonst bestehen, wenn nicht aus
"Algorithmen und Datenstrukturen" (und natürlich aus zugehöriger
Hardware)
Ob die Algorithmen "Nummern fressen", während sie durch eine Matrix
huschen (machen sie ja bei Bildverarbeitungen auch), oder ob sie nur
Bits an irgendwelchen Ports ein und ausschalten, ist ja erst mal
grundsätzlich unerheblich.
In der gegebenen Aufgabenstellung (PC -> µC) wäre vielleicht interessant
zu wissen, wie die Portierung statt finden soll, und was dann mit der
"Erkenntniss" der KI passiert:
1. Sensoren: z.B. eine Kamera am PC wird sicherlich anders angesteuert
werden als eine am µC.
2. Die eigentlichen KI-Lern-Algorithmen (bzw. Auswerte-Algorithmen)
sollten (incl. der zugehörigen Datenstrukturen) vermutlich vom PC zum µC
portierbar sein.
3. Aktoren: Die "Erkenntniss" das es sich (z.B. bei Bilderkennung) z.B.
um einen Schuh handelt ist am PC ja einfach darzustellen als "Es wurde
ein Schuh erkannt". Im µC werden doch aber sicherlich darauf hin noch
weitere Aktionen daraus folgen, bei dem irgendwelche Aktoren gesteuert
werden (halt irgendwelche Steueraufgaben, die dann folgen)
Punkt 2 (anscheinend die "Kernfrage" des Thread-Eröffners) scheint mir
das geringste Problem zu sein, enn man schon direkt am PC passende Tools
verwendet (z.B. das erwähnte TensorFlow)
Frank E. schrieb:> Ein NN skaliert also ...
Das war ja gar ncht mein Einwand bzw. Hinweis in meinem Beitrag, ob oder
wie stark ein NN skaliert. Derartiges hat natürlich generell Bedeutung
bei der Dimensionierung der "Mikrocontroller-Portierung", da dessen
Ressourcen im algemeinen knapp(er) bemessen sind als bei einem PC,
insbesondere was den RAM-Speicher betrifft (in dem ja die Datenstruktur,
d.h. Matrix, vorgehalten werden muss)
Jan B. schrieb:> Mit TensorFlow Lite ist das möglich.> https://www.tensorflow.org/lite/microcontrollers
Richtig guter Tipp. Das ist GENAU das, was ich gesucht habe.
Wegstaben V. schrieb:> 1. Sensoren: z.B. eine Kamera am PC wird sicherlich anders angesteuert> werden als eine am µC.
Das "Außenrum" ist ja eher unkritisch. Am PC verwende ich zuvor
aufgezeichnete Daten vom µC. Am µC selbst kann ich die Daten natürlich
direkt vom Sensor auslesen.
Als erstes Projekt möchte ich damit ein paar einfache Brettspiele
Umsetzen (Tic Tac Toe, 4 Gewinnt...). Eine SK6812 LED Matrix, ein paar
Buttons und einen ESP32 sollen dafür ls Hardwareplatform dienen.
Danach würde ich mit dem ESP32 und einem entsprechenden Sensor gerne
eine Gestensteuerung realisieren.
Von ARM gibts auch noch die CMSIS NN:
https://www.keil.com/pack/doc/CMSIS/NN/html/index.html
Auf YT gibts einige Talks dazu die zeigen wie man mit diversen
Frameworks vorab ein Modell trainieren kann und anschließend für den µC
"zusammenstaucht".
Jene Image-Recognition Demo hier auf einem Cortex M7 find ich eigentlich
schon recht beeindruckend. Klar, das Set ist winzig, aber könnt mir
durchaus die ein oder andere Anwendung dafür vorstellen:
https://youtu.be/PdWi_fvY9Og
Wegstaben V. schrieb:> vorab: ich kenne mich mit neuronalen Netzen fast garnicht aus.
Warum antwortest Du dann?
Wegstaben V. schrieb:> Frank E. schrieb:>> Eher nicht.>> Eher doch.
Selber sagst Du, Du hast keine Ahnung. Dann kommt einer, der hat Ahnung.
Und nun willst Du rum diskutieren? Wozu? Du hast doch keine Ahnung über
das Thema!?
Frank E. schrieb:> Eher nicht. Ein Neurolales Netz ist in erster Linie eine (große) Matrix
Genau so sieht es aus.
Vielleicht möchte "Wegstaben V." mal Google bemühen, was ein "Tensor"
ist...
NatürlicheDummheit schrieb:> gibt es eine Möglichkeit
Ja.
Eine wurde dir genannt und findest du gut.
Dein neuronales Netz auf dem Mikrocontroller ist deiner Beschreibung
nach nicht mehr lernfähig.
Damit ist es eine einfache Matrizenmultiplikation.
Interessanter ist die Aufbereitung der Rohdaten, woher die auch immer
kommen, vielleicht sind es ja Bilder mit Featureerkennung. Der dazu
nötige Proigrammcode kann schnell umfangreicher werden, als dein
Mikrocontroller verarbeiten kann.
Bastlerschrieb:> Frank E. schrieb:>> Eher nicht. Ein Neurolales Netz ist in erster Linie eine (große) Matrix>> Genau so sieht es aus.>> Vielleicht möchte "Wegstaben V." mal Google bemühen, was ein "Tensor"> ist...
Ich weiß schon was ein Tensor ist. Technisch halt einfach ein Vektor
bzw. eine Matrix von Zahlenwerten. Auf der werden Rechenoperationen
durchgeführt.
Nichts anderes habe ich mit meinem Beitrag behauptet. Es ging mir halt
(nur) darum heruaszustellen, wo (PC bzw. µC) welche Verarbeitung statt
findet. Das hat der Threaderöffner ja nun geklärt.
vielleicht möchtest du mal gogle bemühen, was "Algorithmen" bzw.
"Datenstrukturen" sind.
Kurzer Statusbericht:
Mit TensorFlow Light klappt das "Deployment" des Modells auf einen ESP32
wirklich gut (ausprobiert mit PlatformIO und Arduino-Framework).
Das komplette TF-Framework und ein einfaches Modell (z.B. das aus dem
Sinusgenerator-Beispiel) benötigen knapp 4% des Flashs. Da ist also noch
genug Luft für größere Modelle :-)
Danke an Jan B. für den Tipp!
Falls du einen ARM MCU nutzt, empfehler ich dir CMSIS-NN zu verwenden.
Da du die Gewichte einzeln portieren müsstest, gibt es ein Framework,
welches als Basis CMSIS-NN verwendet: NNoM
(https://majianjia.github.io/nnom/)
Du kannst damit einfach dein Keras Model nach C portieren (die Gewichte
werden umgerechnet). Achte aber darauf, dass nicht alle Funktionen von
Keras unterstüzt sind. Ansonsten, wie bereits erwähnt bleibt Tensorflow
Lite, was ich aber als sehr mühsam zu portieren in Erinnerung habe. Da
die Keras Gewichte quantisiert werden, kannst du, um eine höhere
Accuracy zu erreichen bereits dein model mit quantisierten Gewichten
trainieren (dann hast du keine Verluste beim konvertieren). Dazu kannst
du QKeras nehmen.
Achte zudem darauf, dass dein Model nicht zu gross wird, ansonsten hast
du wohl zuwenig Speicher.
Als ARM Prozessor empfehle ich dir mindestens einen Cortex-M4.
NatürlicheDummheit schrieb:> Mit TensorFlow Light klappt das "Deployment" des Modells auf einen ESP32> wirklich gut (ausprobiert mit PlatformIO und Arduino-Framework).
Freut mich zu hoeren!
Schorschi schrieb:> Falls du einen ARM MCU nutzt, empfehler ich dir CMSIS-NN zu verwenden.> Da du die Gewichte einzeln portieren müsstest, gibt es ein Framework,> welches als Basis CMSIS-NN verwendet: NNoM> (https://majianjia.github.io/nnom/)
Es gibt noch etliche andere aehnliche Projekte, die von irgendwelchen
Einzelpersonen ins Leben gerufen wurden. Problem dabei ist, dass man nie
weiss, wie lange das nun noch gewartet und auf dem Laufenden gehalten
wird. Bei TensorFlow wird man sich darum keine Gedanken machen muessen.
Hinter dem ganzen CMSIS-NN Zeug steckten etlicht Leute.
Wer nun alles hinter NNoM steckt habe ich nicht gesehen.
Nach der Aufmachung steckt da kein Hobby Freak dahinter.
Und die verwenden RT-Threat, was hier zwar kaum beachtung findet, aber
zu den TOP RTOS zählt. Habe ich auch schon seit 7 Jahren auf einem M4
drauf, allerdings noch eine alte Version, weil das Projekt abgeschlossen
ist.
Ansonsten gibt es, wie Du schon sagtest, etliche Hobby NN im WWW.
Und ich bin gerade auch am suchen nach einer guten Lösung und bin noch
unsicher was nun am besten passt. TensorFlow hört sich gut an, aber da
wird man ja von Code nur erschalgen und findet kaum das was man
eigentlich braucht. Einige der Hobby NN habe ich dagegen mir angesehen
und bei teilweise nur 10 Dateien ist es fast zu übersichtlich.
Peter schrieb:> Wer nun alles hinter NNoM steckt habe ich nicht gesehen.
Gemäss github ist das eine Person (Jianjia Ma, http://aircheese.me/).
Tensorflow wäre toll, allerdings blickt da wohl kein normaler durch, wie
man das auf ein neues Target bringt (klar, für Arduino gehts einfach).
Zudem besteht da noch nicht für alle ARM-Targets die Möglichkeit den
CMSIS-NN kernel zu benutzen, welcher die speziellen DSP instruktionen
(SIMD) verwendet und die Effizient massiv erhöht.
Einer muss das Ding ja anlegen.
Aber wie schon gesagt da wird nicht nur einer hinterstecken, dafür sieht
das zu Professionel aus.
Zu Tensorflow, genau meine Meinug, Tonnen von Code und keine Sau kommt
da mal so eben durch.