AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Neuronales Netz zur Zahlenerkennung

Neuronales Netz zur Zahlenerkennung

Ein Thema von Flips · begonnen am 27. Okt 2007 · letzter Beitrag vom 2. Mai 2008
Antwort Antwort
Flips
Registriert seit: 17. Feb 2005
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 ) 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]
Miniaturansicht angehängter Grafiken
screen_504.png  
Angehängte Dateien
Dateityp: zip nnsource_231.zip (7,8 KB, 234x aufgerufen)
Dateityp: zip neuronetz_610.zip (230,5 KB, 299x aufgerufen)
 
Nuclear-Ping
 
#2
  Alt 27. Okt 2007, 19:00
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"

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.
  Mit Zitat antworten Zitat
Flips

 
Delphi 7 Professional
 
#3
  Alt 28. Okt 2007, 11:29
Zitat von Nuclear-Ping:
Aber wozu ein Schieberegeler, um die Zahl die er erkennen soll, einzustellen? Klingt fast nach "Zahl := Trackbar.Position"
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 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^^
Philipp F.
  Mit Zitat antworten Zitat
steven11
 
#4
  Alt 2. Mai 2008, 15:19
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
  Mit Zitat antworten Zitat
Flips

 
Delphi 7 Professional
 
#5
  Alt 2. Mai 2008, 15:27
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.
Philipp F.
  Mit Zitat antworten Zitat
steven11
 
#6
  Alt 2. Mai 2008, 15:37
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 ?
  Mit Zitat antworten Zitat
Flips

 
Delphi 7 Professional
 
#7
  Alt 2. Mai 2008, 16:00
Entweder neuer Thread oder hier klicken
Sonst wirds OT
Philipp F.
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

 
Delphi 2005 Personal
 
#8
  Alt 2. Mai 2008, 16:27
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.
  Mit Zitat antworten Zitat
Flips

 
Delphi 7 Professional
 
#9
  Alt 2. Mai 2008, 17:18
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
Philipp F.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf