Um aber nochmals auf den Kern zurückzukommen, folgendes.
DIE, programmiertechnisch und vom Verstehen der Materie her, einfachste Struktur für ein KNN gibt es eigentlich nicht.
Ein Beispiel ist die Aktivierungsfunktion. Wenn man die einfach linear gestaltet, stößt man früher oder später auf Probleme, die das Netz womöglich nicht lösen kann. Dasselbe gilt für Lernen aus Fehlern. In manchen Fällen funktionieren solche Funktionen besser und in anderen Fällen andere Funktionen, was die Lerngeschwindigkeit und Genauigkeit anbelangt. Es kann wohl auch zu so einer Art Dauerschleife im Netz kommen, wo das Netz nie zu einem Ergebnis kommt. Aus diesen und anderen Gründen werden in den Netzen oft nichtliniare Funktionen verwendet. Da geht es dann nicht mehr nur um "0" und "1" oder "an" und "aus", sondern da wird schon mal ein Tangensberechnung bemüht oder was anderes.
Ich bin aber nicht der Spezi für solche Dinge.
Vielleicht kann sich Stochri nochmal äußern, wie (oder mit welchen "Basics") er sich das vorstellt umzusetzen?
MFG
![]()
Ich bin mit dem Thema noch nicht durch, aber ich habe zumindest einmal den Linienfolgermechanismus mit einer Wahrheitstabelle getestet.
Als Quellcode habe ich den genommen, wo MXT den Link auf die Beispielseite gesetzt hat.
Es sind etwa 2400 bis 2800 Trainingszyklen notwendig, bis die vorgegebene Genauigkeit erreicht wurde. Die Werte, welche diese bestimmen, wurden aus dem Originalquelltext beibehalten.
Das Training dauert, auf einem nodeMCU ESP-12E, ca. 5 Sekunden.
Da es sich um analoge Berechnungen handelt, sind die Werte der Ausgabeneurone Fließkomma-Näherungswerte. Eine Berechnung im KNN stellt immer eine Annäherung dar.
Würden die Ausgaben, ohne Nachkommastellen, gerundet, erhielte man das gewünschte Ergebnis, als "0" oder "1".
Die Trainingszyklen variieren bei jedem Neustart, weil in den Berechnungen Zufallswerte mitspielen. So werden u.a. die Neuronengewichte Anfangs mit Zufallswerten und nicht mit immer gleichen festen Werten initialisiert.
Die Fließkommaergebnisse variieren genau so, weil es Näherungswerte sind und eben in den Berechnungen Zufallswerte mitspielen.
Im Input haben wir 2 Eingänge. Der Erste, für den linken Sensor. Der Zweite für den rechten Sensor. In der Mitte der Sensoren soll die schwarze Linie verlaufen.
Im Output haben wir 2 Ausgänge.
Der Erste, für den linken Motor, der langsam vorwärts fährt oder steht (0); oder schneller vorwärts fährt (1).
Der Zweite, für den rechten Motor, der langsam vorwärts fährt oder steht (0); oder schneller vorwärts fährt (1).
1. Wenn sich der linke Sensor neben der schwarzen Linie befindet (0), kann der linke Motor laufen (1).
2. Wenn sich der rechte Sensor neben der schwarzen Linie befindet (0), kann der rechte Motor laufen (1).
3. Wenn sich der linke Sensor auf der schwarzen Linie befindet (1), kann der linke Motor stehen oder langsam drehen (0).
4. Wenn sich der rechte Sensor auf der schwarzen Linie befindet (1), kann der rechte Motor stehen oder langsam drehen (0).
Das Ergebnis des neuronalen Netzes sieht dazu so aus; zum Vergleich wird Target (das Muster, auf das zuvor trainiert wurde) mit ausgegeben; Target ist eine Vorgabe und wird nicht durch das neuronale Netz erzeugt:
Input 0 0 Target 1 1 Output 0.98662 0.98579
Input 1 0 Target 0 1 Output 0.01587 0.99852
Input 0 1 Target 1 0 Output 0.99999 0.00660
Input 1 1 Target 1 0 Output 0.99995 0.01100
Input sind die Werte des linken und rechten Lichtsensors, auf die das KNN eine Ausgabe (Output) für den linken und rechten Motor erzeugen würde, um das Fahrzeug zu steuern.
Das stellt für mich jetzt den einfachsten Fall einer solchen Steuerung dar, den man mit einem KNN umsetzen kann. Sozusagen das Notwendigste. Das Trainingsset ist als Wahrheitstabelle fest vorgegeben und wird durch die CPU so lange abgearbeitet, bis die richtigen Reaktionen der Ausgänge, auf die Eingangssignale, stattfinden.
Verwendet habe ich 2 Eingangsneuronen, 2 versteckte Neuronen und 2 Ausgangsneuronen.
Mit einem versteckten Neuron funktioniert es auch. Die Ergebnisse sind dann etwas genauer, die Trainingsphase dauert aber ca. 9 Sekunden, bei ca. 9000 Zyklen:
Input 0 0 Target 1 1 Output 0.98612 0.98504
Input 1 0 Target 0 1 Output 0.01456 0.99999
Input 0 1 Target 1 0 Output 1.00000 0.00847
Input 1 1 Target 1 0 Output 1.00000 0.00998
Mit 10 versteckten Neuronen, ca. 900 Trainingszyklen, bei 4 Sekunden:
Input 0 0 Target 1 1 Output 0.98621 0.98668
Input 1 0 Target 0 1 Output 0.01535 0.99720
Input 0 1 Target 1 0 Output 0.99992 0.00877
Input 1 1 Target 1 0 Output 0.99469 0.00908
Mit 20 versteckten Neuronen, ca. 800 Trainingszyklen, bei 4 Sekunden:
Input 0 0 Target 1 1 Output 0.98555 0.98742
Input 1 0 Target 0 1 Output 0.01570 0.99923
Input 0 1 Target 1 0 Output 0.99999 0.00424
Input 1 1 Target 1 0 Output 0.99645 0.01238
Mit 50 versteckten Neuronen dauern die Berechnungen ca. 12 Sekunden, bei ca. 650 Trainingszyklen:
Input 0 0 Target 1 1 Output 0.98657 0.98793
Input 1 0 Target 0 1 Output 0.01528 0.99561
Input 0 1 Target 1 0 Output 0.99999 0.00667
Input 1 1 Target 1 0 Output 0.99218 0.01062
MfG
- - - Aktualisiert - - -
Übrigens ließe sich nach so einem Schema auch die in einem anderen Thread angezweifelte Waschmaschinensteuerung realisieren.
Geändert von Moppi (13.12.2019 um 19:26 Uhr)
hier sehe ich logische Unschärfen bzw. Unmöglichkeiten, denn langsam kann nicht gleichzeitig dasselbe sein wie stehen.langsam vorwärts fährt oder steht (0)
wenn also aus+langsam+schnell möglich sein sollen:
4 Ausgänge, 2 für motor0 und 2 für motor1:
Daher
out0 0 out1 0: motor0 steht
out0 0 out1 1: motor0 langsam vor
out0 1 out1 1: motor0 schnell vor
out2 0 out3 0: motor1 steht
out2 0 out3 1: motor1 langsam vor
out2 1 out3 1: motor1 schnell vor
hier hätte man dann sogar noch je 1 Kodierung für 1/0 frei.
bei 2 inputs und 4 outputs sind fürs Hiddenlayer 3-5 Neuronen sinnvoll und angemessen.
vgl. hier: https://www.roboternetz.de/community...l=1#post657215 (PS.)
Damit die Outputs eineindeutig sind, sollten sie mit der round() Funktion auf 0/1 ab/aufgerundet werden, sobald sie nach dem Lernen im laufenden Betrieb angewandt werden.
Dann lassen sie sich sogar (fast) direkt zur Pinsteuerung für H-Brücken verwenden.
Und natürlich gilt so etwas auch für Waschmaschinen, was definitiv auch nie von mir angezweifelt wurde.
Geändert von HaWe (13.12.2019 um 20:21 Uhr)
Bedeutet, dass ich zwei Möglichkeiten der praktischen Umsetzung sehe.Der Erste, für den linken Motor, der langsam vorwärts fährt oder steht (0); oder schneller vorwärts fährt (1).
Der Zweite, für den rechten Motor, der langsam vorwärts fährt oder steht (0); oder schneller vorwärts fährt (1).
Selbstverständlich gilt:
langsames Fahren ODER Stehen !== langsames Fahren && Stehen
Ergo:
langsames Fahren ODER Stehen
Aber:
Mir geht es nicht darum, eine Motorsteuerung im Detail vorzustellen.
Zu den Unschärfen schreibe ich jetzt nichts, das würde nicht gut ausgehen.
MfG
![]()
für ein ODER brauchst du 2 seperate Outputs pro Motor, du kannst nicht 1 einzigen Output pro Motor ODERn.
Oder er kann immer nur 1 von beiden ausschließlich, aber nie optional und alternativ.
ODER du hattest es vorher oben unscharf (heißt: missverständlich) fomuliert.
Aber klar, du kannst auf meine Ratschläge aus meinem Wissen und meiner Erfahrung hören und daraus lernen, oder es bleiben lassen.
Ich hatte ja geschrieben, das Eine oder das Andere. Da die Wahrheitstabelle digital ist und das Netz nur auf "0" oder "1" trainiert wird,
folgt der logische Schluss, dass nicht beides gemeinsam verwendet werden kann. Das sieht man.
Aber klar, Dein Wissen und Erfahrung ....
Vielleicht sind für mich, nach 30 Jahren Programmieren und Konzipieren, manche Dinge auch einfach logisch, wenn ich nur kurz drüberlese.
Vielleicht sind daher meine eingestreuten Anmerkungen und Hinweise etwas missverständlich.
Einfach einmal so einen Antrieb und die Steuerung per "0" und "1" entwerfen und schauen, wie es funktionieren könnte, würde ich vorschlagen. Dann versteht Du es vielleicht besser.
Mit Deinem Wissen und Deiner Erfahrung kannst Du Dir aber auch schnell selbst eine rudimentäre Steuerung ausdenken, die einfach verständlich per KNN umzusetzen ist.
Weitere Vorschläge sind im Forum doch eigentlich immer gern gesehen.
Ich hatte auch schon gebeten, dass Du Dein Wissen und Deine Erfahrung über einen Workshop zum Thema darbieten könntest. Dann würde uns allen das mühselige Einarbeiten erspart und wir wären eher auf einem gemeinsamen Nenner. Aber da dies nicht passiert, geschieht zwangsläufig etwas anderes: dass wir jetzt ganz verschiedene Ansichten und Erfahrungen bekommen, was KNNe anbelangt, denn jeder setzt sich mit dem Thema selber auseinander, so gut er es kann. Und das bringt verschiedenste Lösungen hervor, in die sich jeder User hier hineindenken muss.
MfG
- - - Aktualisiert - - -
@HaWe
Übrigens ist das Thema "Workshop" noch nicht vom Tisch. Du kannst damit beginnen, wenn Du Dein Wissen und Deine Erfahrung teilen magst! Ich fände das gut und andere User hier offenbar auch.
Geändert von Moppi (14.12.2019 um 07:12 Uhr)
Lesezeichen