Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Helmut,
Klatschi arbeitet anders als das Dir Bekannte. Ich wollte lediglich erklären, wo und warum es Unterschiede in der Herangehensweise gibt. Ich hab kein Problem damit, wenn Dich mein Gerede nicht erreicht.
Aber ich hab ein Problem damit, wenn Du glaubst, dass ich schüchtern sei. Ich bin nicht schüchtern. Wenn ich was nicht versteh, frag ich stets nach. Ich kann mich nicht erinnern, dass ich bei Deinen Ausführungen schon jemals nachfragen musste. Du erklärst stets sehr gut und nachvollziehbar.
Also hab einfach Geduld. Ich arbeite an dem Dekoder-Problem.
---------------
Hallo Forum,
nach Beseitigung der Bugs bin ich mutig rangegangen und hab meinen ersten Dekodierungsversuch (drei Eingänge, drei Ausgänge) gemacht. Die parallelen Eingänge hab ich einfach per Software serialisiert.
Alles noch gänzlich ohne Training, weil ich erstmal die Selbstorganisation sehen wollte.
Der EEPROM-Inhalt nach dem Durchlauf:
Anhang 34482
Von jedem 16-Bit-Wort zählt immer nur das erste Byte. Drei Bytes geben einen "Link": Source-Zelle, Destination-Zelle und "Nutzen" (Gewichtungen). Ein Nutzen von 0x0A ist der Endanschlag.
Dann hab ich den EEPROM-Inhalt in einem Netz dargestellt:
Anhang 34483
Die Diodensymbole zeigen Zellen an. Die Anode ist der Eingang, die Katode der Ausgang. Die Verbindungen hab ich mit der Stärke beschriftet.
Erfreulich ist erstmal, dass die Software keinen Mist gebaut hat. Alle Verbindungen und Gewichtungen sind erklärlich. Und das in Millisekunden entstehende Netzwerk ist beeindruckend. Ich hab zwei Stunden gebraucht, um es zu analysieren. Ohne es allerdings wirklich zu verstehen. KNN ist schräger Stuff.
Wie erwartet, haben sich Cluster und sogar Rückkopplungen gebildet. Allerdings nicht vollständig ausgebildet. IN_0 ist umfangreich vernetzt. IN_1 schon deutlich weniger. Und IN_2 konnte gar nicht mehr verbunden werden. Mir fehlte es offensichtlich an Zellen und Links. Alle Links wurden verbraucht. Es konnten zwei Zellen überhaupt nicht angeschlossen werden.
Der PIC verfügt nur über 30 Zellen und 42 Links.
Das erinnert mich an ein Geschwür. Klatschi expandiert zu schnell. Zeitlich spätere Ereignisse (wie gesagt: ich musste Helmuts parallele Daten ja serialisieren) haben keine Chance.
Ich muss also das Wachstum bremsen. Erst wenn alle Inputs mit ungefähr gleich vielen Zellen versorgt sind, kann ich an Dekodierungen denken.
Viele Grüße
Wolfgang
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Wolfgang,
Zitat:
Die Diodensymbole zeigen Zellen an. Die Anode ist der Eingang, die Katode der Ausgang. Die Verbindungen hab ich mit der Stärke beschriftet.
eine sehr beeindruckende Graphik. Hast Du sie automatisch aus den Gewichten erstellen lassen?
Was ich nicht verstehe, wie die Werte dort genau zu interpretieren sind.
Ich sehen z.B. oft den Wert 0A.
- - - Aktualisiert - - -
Ein Interpretationsversuch:
Anhang 34484
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Helmut,
"Nutzen" = "Gewichtung". Hatte ich vielfach erklärt. Das mit der seriellen Arbeitsweise erklär ich nochmal in gebündelter Form, wenn ich die PDF erstelle. Im Moment ist es ja nicht so wichtig. Es ist beiden doch letztlich egal, wie Klatschi intern arbeitet. Wichtig ist das Ergebnis. Und das soll dekodieren können.
---------
Hallo stochri,
ich hab einfach LTSpice genommen und mir jedes Byte einzeln "händisch" aus dem Dump abgelesen und versucht, damit ein Netz zu zeichnen.
Mittlerweile bin ich aber schon deutlich schneller. Ich hab die Neigung zu Geschwüren durch zwei Maßnahmen gebremst. Ich duchsuche die Zellen jetzt vom Ausgang kommend. Dadurch können einzelne Eingänge das Netz nicht mehr so schnell mit Zellen vollwuchern. Und ich hab den Detektor zum Neuanlegen von Links etwas straffer gestellt.
Nun kommmt schon was raus (ohne jegliches Training), was an einen Dekoder erinnert (da fehlen noch ein paar Strippen, aber die sind alle unbedeutend:
Anhang 34485
Es hat sich also ganz ohne Training eine 1:1 Dekodierung ergeben. Das ist nun keine Spezialversion der 20 Zeilen. Das soll so bleiben. Er kann jetzt alten Omas ausweichen UND dekodieren. Zumindest stehen genug Zellen pro Pin zur Verfügung.
Das reicht mir erstmal für heute. Ich werde so langsam zum Klatschi-Versteher.
Ich muss mir nun eh Gedanken machen, wie ich das arme Ding für falsche Dekodierungen bestrafe und was dann genau mit dem Netzwerk geschehen soll.
Das kriegen wir auch noch hin.
Viele Grüße
Wolfgang
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo stochri,
ich wusste nicht, dass Du "arduinifizieren" wolltest. Die Freitags-Version war noch sehr krank. Hier die aktuelle Sonntags-Version:
Anhang 34486
----
Zu Deinen "Arduinifizierungen":
FALSE ist bei mir 0
TRUE ist bei mir 1
Der FSR, INDF-Mechanismus ist ein PIC-Feature und zentral. Ich denke an den Konstrukt:
static unsigned char* FSR;
#define INDF (*FSR)
Du solltest auch keinesfalls mit 16-Bit-Werten arbeiten. Dann scheitern Schleifen, Offsets und Bit-Dröseleien.
Ich rechne damit, dass die Anzahl meiner Links eh nicht reichen wird, um Dekoder zu errichten. Dann muss ich sowieso auf Tiny85 umsteigen. Dann gibts naturgemäß kein "Arduinifizierungs"-Problem mehr.
Ich hatte den PIC lediglich genommen, weil er mich gleich zum sparsamen Umgang mit allen Ressourcen anhalten sollte. Mal gucken, wie weit ich damit noch komme....
Ich wäre dafür, dass wir weiterhin gemütlich bleiben. In der Ruhe liegt die Kraft. Zum Nachbauen oder gar zum Konvertieren auf andere Plattformen ist es m.E. noch zu früh. Ich kümmere mich noch nicht um Versionenpflege und Administration und will das zur Zeit auch keinesfalls im Hinterkopf haben. Auch die Anzahl meiner "Links" und Zellen ist beschränkt... ;)
Viele Grüße
Wolfgang
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo,
Dekoder klappt bestens:
10 -> OUT_0
01 -> OUT_1
11 -> OUT_2
Mikrominimale Erweiterung an der Source. Neue Links werden im "learn"-Mode auf die gewünschte Ausgangszelle gelenkt:
Anhang 34487
Es werden nun genau vier Links angelegt und keinerlei Neuronen belegt. Links mit "FF" am Anfang sind noch leer:
Anhang 34489
Das sich ergebende Netzwerk ist anscheinend goldrichtig:
Anhang 34488
Der Nutzen aller Links ist noch "00", weil sie halt erst gelernt und noch nicht benutzt wurden.
So wurde das Programm aufgerufen:
Code:
FOREVER {
switch(loop) {
case 0: pattern = 0x01; learn = AKT_0; break;
case 1: pattern = 0x02; learn = AKT_1; break;
case 2: pattern = 0x03; learn = AKT_2; break;
default: FOREVER;
}
gi_lerne();
loop++;
}
Es wurde also für jedes pattern ein zuzuweisender Ausgangsport festgesetzt.
Damit sind also Dekoder mit logischen Verknüpfungen realisierbar.
Ich bin mir noch nicht sicher, ob out_2 wirklich bei "11" kommt oder schon bei einem der beiden Bits. Zu dem Test müsste ich in die RAM-Zellen gucken können, damit ich sehe, wann die feuern. Kann ich aber nicht.
Da muss ich mir noch was zum Test einfallen lassen. Da kann ich noch ne kleine Leiche im Logik-Keller haben.
Viele Grüße
Wolfgang
---------------
So würde ich ODER "einlernen" (schreckliches Wort):
pattern=0x10 learn=AKT_2
pattern=0x01 learn=AKT_2
und so UND:
pattern=0x11 learn=OUT_2
Ich bin mir aber noch nicht sicher, ob das Klatschi auch so siieht.