Brain.dll - Neuronale Netze für KI's und Vorhersagen

    • Release
    • Closed Source

    Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von mrwebber.

      Brain.dll - Neuronale Netze für KI's und Vorhersagen

      Name:
      Brain.dll

      Beschreibung:
      Inspiriert durch:
      golem.de/news/maschinenlernen-…derassen-1407-107891.html
      Lasse deine Programme von nun an selbstständig lernen! Du kannst mit der Brain.dll Bilderkennungen, KIs, und viele weitere lernende Programme ohne Umstände implementieren.
      Es ist kein mathematisches Verständnis über Neuronale Netze nötig, kann aber durchaus beim Finden der richtigen Einstellungen hilfreich sein.
      Für Einsteiger in das Maschinenlernen ist die .dll ideal geeignet!


      Details:
      - Implementierung des Backpropagation-Algorithmus
      - Zielgruppe: Einsteiger in das Thema Neuronale Netze, Fortgeschrittene User können auch von der einfachen Anwendung profitieren

      - Inputschicht: Beliebig viele Neuronen
      - Versteckte Schicht: 1 Hidden Layer mit beliebig vielen Neuronen
      - Outputschicht: Beliebig viele Neuronen
      - Aktivitätsfunktion: Sigmoid

      Screenshot(s):

      Anwendungbeispiel: Erkennung eines per Maus gezeichneten Buchstabens

      Verwendete Programmiersprache(n) und IDE(s):
      Visual Basic .NET / IDE Visual Studio 2012

      Systemanforderungen:
      .NET-Framework 4.0

      Systemveränderungen:
      Keine

      Download(s):
      Download .dll incl. Beispielprojekt (OCR Texterkennung, siehe Screenshot) im Anhang!

      Lizenz/Weitergabe:
      Freeware, mit Namensnennung

      Falls ihr diese .dll hilfreich findet, klickt auf "Hilfreich", damit auch andere darauf Aufmerksam werden :)
      PS: Die .dll kann viel mehr als nur Texterkennung - ihr könnt beliebige Dinge einlernen!
      Dateien

      Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
      Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
      :thumbsup:

      Dieser Beitrag wurde bereits 14 mal editiert, zuletzt von „mrwebber“ ()

      Hi, wie du siehst, ist das @ zu komplex für eine 5 x 5 - Auflösung. Hier ist rechts in der Vereinfachten Version auch als Mensch kein @ mehr zu erkennen, oder? Und sieht tatsächlich aus wie ein y :D
      Da müsstst du mehr Pixel verwenden :) Dieses Beispiel dient nur zur Veranschaulichung für das Maschinelle Lernen mit der .dll allgemein. Die .dll ist unabhängig von der Texterkennung. Das hier ist für ein paar Grundbuchstaben gedacht. Wenn man das ernsthaft machen möchte (Texterkennung), muss man deutlich ausgeklügelter rangehen :)

      Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
      Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
      :thumbsup:
      Hi! Finde das gesamte Thema sehr interessant! Hab mir die .dll runtergeladen und bissl mit rumgespielt!
      Mich würde nur interessieren welches neuronale Netz bzw. welche Einstellung am besten ist?!?

      Hast Du die .dll selbst geschrieben oder hast Du Quellverweise??

      Weil, bei manchen Aufgaben dauert das "lernen" Ewig! Ist es dann besser eine größere versteckte Schicht zu wählen?

      Z.B. wenn ich "Ihm" die Buchstaben "B", "E" und "F" lernen lassen will kommt es meist zu ewigen Lernzyklen! Hab, wie gesagt schon bissl mit den Einstellungen rumgespielt, aber so richtig Rund wills nicht laufen!

      Für ein bisschen mehr Informationen bezüglich der Funktionsweise des "Brain" wär ich sehr verbunden!

      Grüße! :D
      Hallo zusammen, schön, dass euch das Thema auch interessiert ;)

      Ja, ich habe die .dll geschrieben, und es besteht noch viel Luft nach oben.

      Die Eingangspixel-Anzahl von 25 ist teilweise einfach zu gering, um manche Bustaben sauber zu unterscheiden.
      Es bietet sich auch an, das Eingangsbild erst einmal zu skalieren, und danach ins Netz zu geben.
      Denn sonst würde ein "i", das man auf der linken Seite einlernt, nicht erkannt werden, wenn man es auf der rechten Seite zeichnet.

      Warum lernt das Programm ewig? Wenn die Buchstaben zu ähnlich sind, wird das Netz immer von einer Richtung in die andere getrieben. Möglicherweise sind sich die Buchstaben so ähnlich,
      dass der gefordete Höchstfehler (in BasicOCR hartcodiert^^) nicht mehr unterschritten werden kann.
      Es langt momentan eben, dass nur ein einziger Buchstabe den Grenzwert überschreitet, und schon ist man in der Endlosschleife.
      Möglicherweise ist die Lernrate zu hoch, sodass der mathematische Algorithmus über die Lösung immer drüber springt.

      Abhilfe soll eine neue Version schaffen. Ich habe eine Möglichkeit eingebaut, dass nur der durchschnittliche Fehler als Grenzwert verwendet wird, damit man nicht wegen einem einzigen Ausreißer in die Endlosschleife kommt.
      Das ist allerdings eine frühe Alpha-Version (des Testprojekts, die .dll ist fertig).

      Änderungen:
      • Mehr Eingangsneuronen (bzw. selbst wählbar, gerade Zahlen nötig glaub ich)
      • Eingangsneuronen, Lernrate, Maximalfehler, etc. direkt in Form1.vb einstellbar
      • Debugmodus: Gibt auf der Debug-Console in Visual Studio den aktuellen Lernstand aus, sodass man abschätzen kann, ob noch was passiert (oder ob man andere Parameter braucht)
      • Ich wollte Buchstaben mithilfe der Windows-Schriftarten einlernen, das ist noch nicht praktikabel
      Wer will, kann gerne diese Version testen. Gerade das Skalieren der Eingangswerte hat sich als sehr hilfreich herausgestellt.

      PS: Noch zu den Fragen von @Morrison: Es gibt bei Neuronalen Netzen nicht "die perfekten" Einstellungen. Da ist immer sehr viel Ausprobieren nötig. Generell ist es aber so, dass eine größere Anzahl versteckter Neuronen den Lernprozess langsamer machen. Man sollte also die "kleinstmögliche" Anzahl nehmen. Also so klein, bis das Netz so dumm ist, dass es die Aufgabe nicht mehr versteht. Also besser kleinere Werte. Wenn die die Theorie dahinter interessiert, sehr zu empfehlen für das Verständnis zur Benutzung:
      • https://vimeo.com/56882963
      Und schließlich PPS: Die Buchstabenerkennung dient nur als Beispielprojekt für die .dll und ist auch nicht sehr ausgereift. Die .dll ist vielseitig einsetzbar. Mit etwas Mühe kann man damit eine richtige Buchstabenerkennung basteln, aber auch kleine Wettervorhersagen, etc. machen. Ich mal nach Anwendungsmöglichkeiten für neuronale Netze suchen. Generell solltet ihr sie immer dann einsetzen, wenn ihr keine Formel für euer Problem habt, aber dennoch einige Frage/Antwort-Beispiele kennt -> Also ihr müsst dem Netz immer ein paar richtige Beispiele zeigen, und dann löst es euch mit etwas Glück auch ähnliche Probleme von selbst!
      Dateien

      Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
      Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
      :thumbsup:

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „mrwebber“ ()

      hmm, aber die brain.dll iss die selbe?!?
      P.S.: beim rumtüfteln hab ich die 25x25 auch vergrößert! ..eig. umso größer desto besser..und die Implementierung von FontTools steht bei mir ganz vorn!! Möchte nämlich alle Schriftarten analysieren! ;)


      EDIT: Hab jetzt des BrainBundle1.1 nochmals runter geladen und hab nun eine völlig andere Version von dem Proggi!! :D Funzt aber super!! ..nur leeider nur mit Großbuchstaben, oder?

      Hab bissl im QC rumgeschaut und da wird von upperCase ausgegangen und inne List wird des Char als lowerCase gespeichert!!! :/
      D.H.: Man müsste des vorhandene TrainingSet bearbeiten das da noch Platz für die lowerCase Letters sind oder man erstellt ein neues TrainingsSet!

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Morrison“ ()

      An der .dll habe ich "nur" den dritten Trainingsmodus "RandomAvg" hinzugefügt, damit das Training nicht von einem einzigen schlechten Training Pattern vermiest wird ;) Und du kannst die Debug-Ausgabe manuell aktivieren, um den aktuellen Lernfortschritt zu beobachten.

      Freut mich, dass du weiter gekommen bist!
      Ja 25x25 ist sehr knapp bemessen, das Beispielprojet ist bei mir morgens vor dem Aufstehen mit Laptop im Bett enstanden. Hätte ich vllt. etwas mehr Mühe reinstecken sollen. War ja nur als Demo für die eigentliche .dll gedacht ^^
      Eine Sache: Hast du ZU viele Eingänge irgendwann, dann brauchst du wieder mehr Training Pattern. Das liegt daran, dass dann mehrmals geschriebene Buchstaben viel unterschiedlichere Muster ergeben (mehr Pixel = mehr Details).
      Kannst ja gerne mal deine Version hier posten, wenn du gute Fortschritte gemacht hast. Bin auch komplett neu in der Texterkennungs-Thematik und hab mich nur im Sinne dieser Beispielprojekte damit beschäftigt :)

      Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
      Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
      :thumbsup:
      Wärs dann nicht cool würde man einen beliebig großen Input Buffer angeben können? Ich habe deine Bibliothek nicht ausprobiert aber beschränkt sich die Eingabe auf Bilder oder kann ich jeden beliebigen byte Buffer reingeben?
      Die .dll nimmt beliebige Double-Werte/Double-Arrays als Eingabe und Ausgabe - also geht :)
      Nochmal: Die .dll wird nur beispielhaft für Bilderkennung verwendet ;) Im Endeffekt wird intern alles auf Zahlen gemappt.

      EDIT: @Morrison: Ich habe ein neues Brain Bundle 1.1 hochgeladen. Es enthält das neue Beispielprojekt, mit dem die Erkennung unserer 26 Großbuchstaben schon gut funktioniert. Ich habe einige Samples eintrainiert. Falls das Netz beim Benutzen dennoch Fehler macht, können diese direkt korrigiert werden. Wird das Programm also ein paar mal verwendet, wird es immer besser :)

      Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
      Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
      :thumbsup:

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „mrwebber“ ()

      Hi. Teste gerade mal dein Programm. Habe mal das Beispiel von youtube (part 2) nachgebaut, dass funktioniert bestens.

      1) Wenn ich jetzt aber z.B. die Funktion F(x,y) = 2x+2y antrainieren will, dann findet der einfach kein Ende... Sollte doch aber machbar sein, oder? Hatte es so probiert:

      VB.NET-Quellcode

      1. Dim patternList As New List(Of Double())
      2. patternList.Add({0, 0})
      3. patternList.Add({1, 1})
      4. patternList.Add({2, 2})
      5. patternList.Add({3, 3})
      6. Dim targetList As New List(Of Double())
      7. targetList.Add({0})
      8. targetList.Add({4})
      9. targetList.Add({8})
      10. targetList.Add({12})
      11. br.train(patternList, targetList, 0.4)


      2) Dann ist irgendwie ein neuer Wert im Konstruktor dazugekommen, nur leider finde ich keine Erklärung dazu was der Wert macht.

      VB.NET-Quellcode

      1. Private br As New Brain.Backpropagation(2, 1, 2, 0.2, 0.1, False)


      Was bewirkt der Boolean am Ende?

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „rdmguy“ ()

      Hi!


      Aussm Quellcode:


      if bool = true then

      Spoiler anzeigen

      C#-Quellcode

      1. Debug.Print(string.Concat(new string[]
      2. {
      3. "Current network output distance: ",
      4. Conversions.ToString(dErrs[i]),
      5. " (",
      6. Conversions.ToString(dMaxError),
      7. " accepted)"
      8. }));

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Morrison“ ()

      Hallo rdmguy! Freut mich, dass auch du dich für dieses Thema interessierst :)

      Zu 1) Ja, theoretisch ist sowas möglich. Da müssen allerdings mehrere Punkte beachtet werden.
      1. Die Anzahl der versteckten Neuronen muss ausprobiert oder ergooglelt werden (so ein lineares Problem wurde sicherlich irgendwo untersucht)
      2. Es handelt sich nun nicht mehr um ein "boolsches" Problem. Denn auch für die Buchstabenerkennung habe ich 26 Ausgänge (also für jeden Buchstaben 1 Ausgang, der zwischen 0 und 1 liegt). Eine solche Aechitektur ist deutlich robuster, da die Ausgangspattern (Targets) deutlich unterschiedlichere Werte haben.
      3. Ich habe gelesen, dass neuronale Netze vor allem im nirdrigen Zahlenbereich schnell lernen. D.h. mit Eingangswerten und Ausgangswerten <= 0,1
      GRUNDSÄTZLICH: Sind nur Werte von -1 bis 1 erlaubt. Das hätte ich erwähnen sollen.
      Du könntest also mal versuchen, deine Patterns mit einem Vorfaktor zu belegen. Du teilst also deine x und y vor der Berechnung durch 1000 und das Ergebnis nach der Rechnung machst du wieder mal 1000.
      4. Ich bin auch kein Experte in dem Thema, und habe mir das auch mehr oder minder mit Learning by Doing beigebracht. Jemand, der sich richtig auskennt kann dir vllt. auch noch andere oder ausschlaggebendere Gründe nennen
      5. Was ich noch mal erwähnen muss: Für dieses Problem hast du eine Formel -> Die Nutzung eines Netzes wäre hier unnötig und fahrlässig. Mir ist klar, dass du hier nur die Möglichkeiten eines solches Netzes testen willst, und somit ist dein Test vollkommen berechtigt. Wollte es nur nochmal an dieser Stelle betonen: Neuronale Netze nur, wenn man keine Formel hat, sondern nur ein paar Eingangswerte und deren korrekte Lösungen.

      2) Der Parameter aktiviert die Debug-Ausgabe in der Visual Studio-Konsole. Sehr hilfreich, gerade wenn man noch forscht, wie in deinem Fall. Dann kannst du nämlich den Lernfortschritt anhand von Fehlerzahlen beobachten. Kannst es natürlich auch über eine Progrewsbar machen, aber anhand der Zahlen sieht man gerade den Trend von Änferungen un den hinteren Nachkommastellen am besten.

      Viele Grüße

      Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
      Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
      :thumbsup:
      Danke für deine ausführliche Antwort, MrWebber.

      Werde es mal mit der Faktorisierung der Trainingswerte probieren. Und ja... Brauchte halt iwas zum Testen, wo ich erstmal die Ein- und Ausgabewerte kenne, so dass ich Fehler ausschließen kann. Daher die Formel... Man kann sich die Formel ja später auch wegdenken, bzw. später auf Probleme anwenden, wo eine Formel nicht bekannt ist.

      mrwebber schrieb:

      1. Die Anzahl der versteckten Neuronen muss ausprobiert oder ergooglelt werden (so ein lineares Problem wurde sicherlich irgendwo untersucht)

      Danke für den Hinweis. Werde dem mal nachgehen.
      Habs auch nochmal probiert mit dem linearen Problem. Konnte es auf die Schnelle auch nicht eintrainieren. Hat er sich standhaft geweigert :)
      Möglicherweise benötigt ein solches Problem auch mehr als nur 1 versteckte Schicht. Die meisten Probleme brauchen zwar nur 1 versteckte Schicht, es gibt aber auch Ausnahmen.
      Es sieht danach aus, als wäre ein solcher Anwendungsfall (trotz seiner scheinbaren Einfachheit) nicht so einfach einzulernen. Okay immerhin muss das Netz multiplizieren lernen.

      Ich glaube es ist allgemein besser, sein Projekt auf ein Bool'sches Problem abzubilden. Wie im Falle der Buchstabenerkennung.
      Ich hätte theoretisch auch sagen können:

      1 Ausgangsneuron und folgende Zuordnung:
      A: 0,05
      B: 0,10
      C: 0,15
      D: 0,20
      E: 0,25
      F: 0,30
      ...

      Ich denke, dass diese Umsetzung deutlich schwieriger zu trainieren wäre - wenn nicht sogar praktisch unmöglich (zumindest bei gleicher Performance).
      Probiert habe ich es allerdings nicht ;)

      Variablen über das Internet senden? [VB.NET] Universal Ticket.dll :thumbup:
      Lasse deine Programme selbstständig lernen! [VB.NET] Brain.dll
      :thumbsup:

      ichduersie schrieb:

      Habs mal getestet. Ich würds nicht nutzen :/


      Danke für den Post, ich hatte den übelzten lachflash aller zeiten !!

      100% save :DD
      Aber ich find es gut, ausbaufähig, aber gut :) :thumbsup: und die Bilder haben mich lachen lassen wie schon lange nicht mehr ^

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Blackn0va“ ()

      Hammer idee!
      Bin echt beindruckt. Darf man diese DLL viellicht in seinem eigenen Programm verwenden mit Names nennung?
      Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

      Für VB.NET Entwickler: Option Strict On nicht vergessen!