Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Neuronales Netz zur Zahlenerkennung (https://www.delphipraxis.net/102386-neuronales-netz-zur-zahlenerkennung.html)

Flips 27. Okt 2007 16:04


Neuronales Netz zur Zahlenerkennung
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo alle Zusammen,

da ich mich vor einiger Zeit unbedingt mal mit neuronalen Netzen beschäftigen wollte, habe ich im Internet (vergeblich) nach Beispielcode in Delphi gesucht.
Nach einem neuen Thread und vielen Stunden des Verzweifelns (und natürlich ganz viel Kaffee :-D ) hab ich jetzt endlich einen brauchbaren Code.


Das Programm funktioniert folgendermaßen:
- Zuerst muss das Netz lernen, deshalb stellt man am Regler "Durchgänge" die Anzahl der Durchgänge ein (die genaue Anzahl wird in der Statusbar angezeigt).
Wenn man einen Rechner über 2GHz hat sollte man sich nicht scheuen, den Regler ganz nach rechts zu schieben ;-)
Die Lernkonstante (Störfaktor) kann bleiben, man kann allerdings auch damit experimentieren :-)
Wird die Checkbox "Debug-Modus" aktiviert, so erstellt das Programm nach Abschluss der Lernvorgänge eine Datei synapsen.txt auf C:\, in der für jedes Neuron die einzelnen Synapsenwerte (Gewichte) aufgelistet sind.
Jetzt kann man auf Lernen klicken und warten^^
- Den Abschluss des Lernvorgangs erkennt man daran, dass plötzlich eine Zahl auf der Panelfläche erscheint. Jetzt kann mit Hilfe der Trackbar unter den Panels eine Zahl angegeben werden, danach einfach auf Prüfen klicken et voilà.
Jetzt könnt ihr die Panels natürlich nach belieben verändern.

Zum Aufbau des Netzes:
Das neuronale Netz ist so gut es geht OO geschrieben, was bestimmt einigen bei näherer Betrachtung sehr unnötig erscheinen wird. Allerdings denke ich, dass es sich so einfacher erweitern lässt.
Es gibt nur zwei Neuronenschichten, eine Inputschicht mit 8*8 Neuronen, und eine Outputschicht mit 10 Neuronen, für jede Zahl 1 Neuron.

Der Programmierstil ist vielleicht nicht der sauberste, dafür habe ich den Code möglichst gut lesbar formatiert und dokumentiert.


Ich hoffe, dass jeder der an diesem Thema interessiert ist seine Kritik dazu äußert, gibt sicherlich ne Menge^^

Ps: Thx @ brinkee, die Idee des Programmaufbaus stammt von ihm :-)

[Edit]Aus gegebenen Anlass noch schnell ein Verweis auf einen anderen Thread, dass hier dargestellte "Pattern-Associator"-Netz ist vom Aufbau her identisch mit diesem hier, nur sauberer was Aufbau und Namensgebung angeht.[/Edit]

Nuclear-Ping 27. Okt 2007 19:00

Re: Neuronales Netz zur Zahlenerkennung
 
Klingt interessant. Werds mir mal runterladen und anschauen.

Aber wozu ein Schieberegeler, um die Zahl die er erkennen soll, einzustellen? Klingt fast nach "Zahl := Trackbar.Position" :mrgreen:

Ich hatte mal ein anderes Demo-Programm, was in C++ geschrieben war (finde leider grad den Link nich auf die schnelle ...) und da hatte man ein Feld, in das man zeichnen konnte und er hat daraus dann den Buchstaben erkannt.

Flips 28. Okt 2007 11:29

Re: Neuronales Netz zur Zahlenerkennung
 
Zitat:

Zitat von Nuclear-Ping
Aber wozu ein Schieberegeler, um die Zahl die er erkennen soll, einzustellen? Klingt fast nach "Zahl := Trackbar.Position" :mrgreen:

:-D nein ganz so einfach ist es nicht^^ Der Regler dient ja nur dazu, den Usern die Eingabe einer Zahl einfacher zu machen, man kann sie natürlich auch manuell hinschreiben ;-)
Zitat:

Zitat von Nuclear-Ping
Ich hatte mal ein anderes Demo-Programm, was in C++ geschrieben war (finde leider grad den Link nich auf die schnelle ...) und da hatte man ein Feld, in das man zeichnen konnte und er hat daraus dann den Buchstaben erkannt.

So eins hatte ich in Basic gefunden, daraus hab ich mir die ersten Prototypen zusammengewürfelt^^

steven11 2. Mai 2008 15:19

Re: Neuronales Netz zur Zahlenerkennung
 
Hi, wenn ich das Prog strarten will bekomm Ich einen Bluecsreen (emBDA.sys)

PC:

Windows Vista Ultimate

AMD Athlon 64 X2

2,5 GB RAM

Geforce 7600GT

120 GB HDD



Auch bei dem Programm "Cam Alert" kommt dieser Fehler.

pls help


mfg

Flips 2. Mai 2008 15:27

Re: Neuronales Netz zur Zahlenerkennung
 
Hi.

Da es sich laut google um nen USB-TV-Treiber handelt, liegt es glaube ich nicht an meinem Programm :-)
Hier hat jemand das gleiche Problem, vielleicht hilft das ja.

steven11 2. Mai 2008 15:37

Re: Neuronales Netz zur Zahlenerkennung
 
Ich habe einen DVB-T Stick am pc ( Hauppauge WinTV-HVR 900 ) vll liegt es daran und wenn ja wie kann Ich dieses Prob beheben ?

Flips 2. Mai 2008 16:00

Re: Neuronales Netz zur Zahlenerkennung
 
Entweder neuer Thread oder hier klicken ;-)
Sonst wirds OT

Nikolas 2. Mai 2008 16:27

Re: Neuronales Netz zur Zahlenerkennung
 
Was passiert denn, wenn du beim Testen in der InputFunktion 10 Pixel zufällig färbst? Ich habe leider keinen WindowsRechner, sonst würde ich das selbst versuchen. Du hast eine sehr kleine Stichprobenauswahl und zusätzlich keine unabhängigen Testdaten.
Das interessante bei einem NN ist ja die (begrenzte) Generalisierungsfähigkeit, d.h. wenn du ein paar Pixel umwirfst, sollte dein NN trotzdem noch halbwegs sinnvoll klassifizieren.

Als Möglichkeit zur Weiterentwicklung könntest du randomisierte Trainingsdaten benutzen, in dem du beim Trainieren in jedem Bild 5 InputNeuronen umwirfst.

Wenn du immer nur deine exakten Trainingsdaten nimmst, wirst du wahrscheinlich in den Effekt des Overfittings reinlaufen, dein Netz erkennt zwar dann die Trainingsdaten, aber nichts anderes mehr wodurch der Sinn eines NNs verschwunden ist.

Flips 2. Mai 2008 17:18

Re: Neuronales Netz zur Zahlenerkennung
 
Hi.

Der Begriff Overfitting ist mir bekannt. Natürlich wäre es sinnvoll, das Netz auchmal mit ner "zerstückelten" Zahl zu füttern und zu trainieren, v.a. da es sich hier ja um supervised learning handelt (für unsupervised halte ich es btw für keine gute Idee).
Allerdings ist dieses Programm ja eher für Lernzwecke gedacht, man findet nur wenig "sauber" programmierte NN (v.a. in Delphi) im Inet. (Ich hoffe, dass ich bald mit meinem Kohonen-Netz fertig bin und den Code hier posten kann, dazu gibt es nämlich noch weniger guten Code im Internet ;-) )
Aber du hast vollkommen recht, besser wäre es, auch mal verfremdete Daten einzuspeisen, wenn ich mal wieder Zeit habe, baue ich das ein!

Noch zu deiner Frage, was dann passiert.
Das Netz erkennt die Zahlen bei mir immer noch gut, auch wenn ich bei der 1 mal ein Loch in den Hals mache und bei der 8 mal den mittleren Strich wegmache ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz