#1 21.05.2005 07:35:48

Lotipats
UltraMember
Registriert: 17.05.2005
Beiträge: 395

Künstliche Neuronale Netze

Hallo,

ich habe hier dieses Thema gestartet, um etwas über Neuronale Netze zu erzaehlen. Ich kann das natürlich nicht perfekt machen, gebe mir aber alle Mühe. Falls ihr etwas nicht versteht, einfach fragen, vllt. kann ich eure Fragen dann beantworten.

Ein Neuron ist in der Biologie eine Nervenzelle. Den Aufbau gebe ich mal nicht an. Man sollte nur Wissen, dass die Neuronen lange Axome haben. Mit Synapsen sind die Axome an anderen Neuronen befestigt.
Eine Nervenzelle kann 10³ bis 10E4 Synapsen an ihrer Oberfläche haben. Das Großhirn hat rund 10E10 Neuronen mit insgesammt rund 10E13 bis 10E14 Synapsen. Daran sieht man, dass die Neuronalen Netze in der Informatik nur sehr vereinfacht sind (im Moment).

Künstliche Neuronale Netze:

Ein Neuron hat nur den Zustand Erregt oder nicht Erregt. Für jedes ankommende Axom hat ein Neuron ein Gewicht, dass darüber aufschluss gibt, wie stark ein Reiz auf dieses Neuron einwirkt. Wenn die Summe aller einwirkenden Reize größer sind als ein bestimmter Wert (Schwellenwert).
Ist ein Neuron erregt, so hat es die Ausgabe 1, ansonsten Null. Die Gewichte liegen zwischen 0 und 1.

Ein Netz besteht aus verschiedenen Schichten. Meistens hat ein Netz eine Eingabeschicht, versteckte Schichten und eine Ausgabeschicht. Die Eingabeschicht leitet die ankommenden Informationen der Aussenwelt an die erste verborgene Schicht weiter. Dort geht es durch alle Schichten, bis es die Ausgabeschicht errreicht. Hier werden die Informationen an die Aussenwelt gegeben.
Je nachdem welche der Neuronen der Ausgangsschicht aktiv sind, steht das Ergebnis fest. Meist wird die Eingabeschicht nicht erwähnt. Man hat dort genau so viele Neuronen, wie Eingabewerte. Die Anzahl Ausgabeinheiten (Neuronen in Ausgabeschicht) hängt von den möglichen Ergebnissen ab.

Mehr dazu später.
Bis jetzt Fragen?

LOTIPATS

Offline

 

#2 21.05.2005 09:46:55

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Künstliche Neuronale Netze

Also im Offtopic-Forum ist diese Diskussion etwas fehlplaziert. wink
Hab mal einfach nen neues Forum gemacht...

Woher weißt du soviel über Neurale-Netze?

Coolcat


My software never has bugs. It just develops random features.

Offline

 

#3 21.05.2005 15:23:45

JorEl
ExtremeMember
Registriert: 29.01.2005
Beiträge: 894

Re: Künstliche Neuronale Netze

Zitat:

Ein Neuron ist in der Biologie eine Nervenzelle. Den Aufbau gebe ich mal nicht an. Man sollte nur Wissen, dass die Neuronen lange Axome haben. Mit Synapsen sind die Axome an anderen Neuronen befestigt.

Wollte nur kurz was richtig stellen - ein Neuron besteht prinzipiell (natürlich vereinfacht) aus Dentriten (Eingabe), Synapsen (Verarbeitung) und Axon (Ausgabe) - d.h. was du da schreibst ist nicht richtig, mal abgesehen davon, dass es Axon und nicht Axom heisst sind diese nicht mit Synapsen an andere Neuronen angeknüpft, das Axon liefert den Output und dieser Reiz wird dann über Dentriten von anderen Neuronen aufgenommen, welche dann anschliessend wieder bei einem gewissen Schwellwert "zünden" oder inaktiv bleiben.

Aber da schon mal ein A.I. thread offen ist kann ich ja eigentlich auch gleich für Interessierte darauf verweisen, hat zwar nicht speziell mit Neural Networks zu tun, aber es sind Ansätze zum Thema "Können Computer denken?":

http://www.logic.at/lvas/185054/Robert-Fizimayer.pdf

Vorweg - das paper ist von mir *g*. Ich habs während einer Seminararbeit geschrieben, falls sich jemand wirklich dafür interessiert empfehle ich auf jeden Fall zusätzlich auch noch Searle's Originalartikel "Minds, Brains and Programs" sowie Eisenstadt's "A chinese room that understands" zu lesen, das ganze ist sehr philosophisch gehalten, aber jeder der sich ernsthaft damit auseinandersetzt wird danach zum Schluss kommen, dass man eigentlich nicht auf triviale Weise beantworten kann ob Computer nun denken können oder nicht.

JorEl


Jesus hat gesagt - selig sind die, die da Leid erfahren, denn sie sollen getröstet werden... Ford Prefect hat gesagt - es ist unheimlich wichtig, dass wir miteinander reden und einen trinken.

Offline

 

#4 21.05.2005 18:27:08

Lotipats
UltraMember
Registriert: 17.05.2005
Beiträge: 395

Re: Künstliche Neuronale Netze

Hallo,

eine Berichtigung:

Zitat:


Wenn die Summe aller einwirkenden Reize größer sind als ein bestimmter Wert (Schwellenwert).

muss heissen
Wenn die Summe aller einwirkenden Reize größer sind als ein bestimmter Wert (Schwellenwert), dann ist das Neuron erregt, es sendet selber einen Reiz.


ich mache mal weiter.

Nicht jedes Netz besitzt verdeckt Einheiten, bei diesen einfachen Netzen bestaht es aus einer Eingabe und einer Ausgabeschicht. Alles nötige wird durch die Ausgabeeinheiten bestimmt.
Im Normalfall gehen künstliche Neuronale Netze eine Art Einbahnstraße, das heisst, dass kein Neuron mit einem schon abgehandelten Neuron verbunden ist, oder einer Einheit, die in der selben Schicht ist, wie das aktuelle Neuron. Aber in seltenen Fällen ist dies auch möglich, da kann auch ein Neuron auf sich selber einwirken (so wie die echten Neuronalen Netze). Dabei muss man aber Abbruchbedingungen im Auge haben, da es ansonsten zu einer Endlosschleife kommen kann.
Eine weitere Modifikation die möglich ist, ist dass die Gewichte zwischen -1 und 1 liegen, wobei meist gilt Gewicht<>0. Damit kann ein Neuron auch hemmend auf ein anderes wirkt. Im Gegensatz zur vorherigen Modifikation wird diese oft verwendet.

Beim Lernen hat man zwei Mengen von Daten. Eine Lernmenge und eine Testmenge. Mit der Lernmenge wird das Netz trainiert. Mit der Testmenge wird das Netz getestet, ob es schon genügend Trainiert ist. Die Testmenge und die Lernmenge sollten keine gleichen Elemente entwalten.
Das lernen läuft in verschiedenen Etappen statt. Dabei ist jede Etappe gleich:
Jedes Element der Lernmenge wird auf das Netz angewendet. Die Gewichte werden bei jedem Element angepasst.
Danach wird die Testmenge mit dem Netz überprüft. Hier werden die Gewichte nicht angepasst.
Wenn nicht alle Elemente (oder ein Definierter Anteil) der Testmenge richtig erkannt wurde, wird eine neue Etappe gestartet, ansonsten ist das Netz trainiert.

Dabei muss man auch aufpassen, dass das Netz nicht übertrainiert wird, dann ist es nicht mehr flexibel und nur noch ein Überdimensionaler Speicher der Lern- und Testdaten.

Für das Anpassen der Gewichte gibt es verschiedene Varianten, von denen ich später ein paar erklären werde.

Fragen?

@Coolcat:
ich habe mich mal mit KI (generell) und Neuronalen Netzen beschäftigt und da ist noch etwas hängen geblieben ;-) Und in Biologie habe ich den Bau.

@JorEl:
Das mit dem Axon und Axom gebe ich gerne zu. Das ist ein Fehler, den ich immer mache.

Zitat:


Man sollte nur Wissen, dass die Neuronen lange Axome haben. Mit Synapsen sind die Axome an anderen Neuronen befestigt.

Ich habe nie behauptet, dass ein Neuron nicht aus noch etwas anderem besteht. Synapsen sind einmal Synapsenköpfchen und die Membran(-teil) eines anderen! Neurons. Diese Synapsen sind an Dendriten oder Zellkörpern. Nachdem die Axone (bis zu 1m lang) zuende sind, sind daran wieder eine Art von Dendriten dran. An diesen sind dann die Synapsenköpchen verbunden.
Damit hats du schon recht, dass das nicht richtig war, aber ich habe die Dendrite weggelassen, um es zu vereinfachen.

Zitat:


Synapsen (Verarbeitung)

Naja, eigendlich ist dort keine Verarbeitung (nicht in dem Sinne), die Gewichte werden hier durch die Nähe des Synapsenköpfchen an der Membran bestimmt, da dadurch entschieden wird, wieviel von der in den Synapsenköpfchen enthaltenen Substanz zu den Poren der Membran kommt. Das kann ich dir genau erklären, wenn du willst.
Gut, das mit dem "zünden" habe ich irgendwie vergessen expliziet zu schreiben., danke für den Hinweis.

LOTIPATS

Offline

 

#5 21.05.2005 23:55:17

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Künstliche Neuronale Netze

Streitet doch nicht. Es gibt soviele unterschiedliche Modelle dieser Funktionsapproximatoren, da hat sicher Jeder recht.

Allerdings ist diese Thema nicht wirklich einfach, und wenn jemand nach diesem "Tutorial" in der Lage sein soll, es in seinem Proggi anwenden zu können, würd ich doch da ein richtiges Tutorial draus machen. Bilder, Bilder sind wichtig! Und dieser Transferfunktion(Summe(Gewichte*Eingänge))-Kram ebenfalls. Aber ich halt mich da von jetzt an besser raus. Lotipats, ich würde mich freuen, wenn Du weitermachst!

Offline

 

#6 22.05.2005 13:47:19

Lotipats
UltraMember
Registriert: 17.05.2005
Beiträge: 395

Re: Künstliche Neuronale Netze

Hallo,

hier muss ich was klarstellen, für jede "Synapse" die Reize zu dem Neuron bringt, gibt es Gewichte.

Beim erstellen des Netzes sollen die Gewichte per Zufall erstellt werden, das verspricht (glaube ich) besseren Lerneffekt.

Wenn man dann lernen will, macht man eine Eingabe. Die Ausgabeeinheiten, die daraufhin den falschen Wert signalisiert haben, werden dann bis zu den Eingabeeinheiten zurück verfolgt und die Gewichte angepasst.

@DerPeer:
Kritik ist immer gut. Damit erreicht man eine neue Qualität.
Natürlich werde ich weiter machen. Aber die Schule geht wieder los, damit bleibt fuer das andere weniger Zeit. Aber ich denke, dass ich zum Schluss sogar ein kleines Programm schreibe (erkenne von Zahlen aus einem 3x3 Muster).  Das wäre dann aber auch meine erste Praxis, da ich bis jetzt noch keine Zeit hatte. Die Theorie sollte aber richtig sein.
Bis zum Programm wird es aber noch etwas dauern, ich hoffe am 03.06. das Prog zu haben, aber ist noch nicht sicher, leider.

@JorEl:
ich hatte noch nicht viel Zeit das zu lesen, aber auf den ersten Blick finde ich das gut (deine Arbeit).

LOTIPATS

Offline

 

#7 22.05.2005 19:59:05

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Künstliche Neuronale Netze

Zitat:


Bis zum Programm wird es aber noch etwas dauern, ich hoffe am 03.06. das Prog zu haben, aber ist noch nicht sicher, leider.

Falls Du dabei Hilfe brauchst, kannst mich gern fragen. Ein wenig hab ich mit diesem Stoff im Moment auch zu tun.

Offline

 

#8 23.05.2005 10:31:47

Lotipats
UltraMember
Registriert: 17.05.2005
Beiträge: 395

Re: Künstliche Neuronale Netze

Hallo,

ich werde vllt. auf dein Angebot zurück kommen, aber noch nicht sicher.
Dennoch Danke!

Bis zum nächsten Beitrag, um weiter vorran zu kommen, kann es noch ein paar Tage dauern. Aber Fragen koennen auch jetzt gestellt werden. Auch Unklarheiten.

Ich muss aber noch sagen, dass es viele Variationen gibt. Ich beschränke mich hier auf einen ganz kleinen Teil.

LOTIPATS

Offline

 

#9 23.05.2005 13:27:59

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: Künstliche Neuronale Netze

Was mich noch interessiert:

wie sind diese Neuronen miteinander verbunden?
Also über ein Axon, das ist mir schon klar. Aber ich frage mich welches Neuron mit einem anderen verbunden ist. Ist das Zufall so das Nreuron N1 mit N523 und N2 mit N3 (z.B.) verbunden ist? oder haben die eine bestimmtes Muster?
Wieviele Neuronen hängen an einem einzelnen dran?
Ist das ein Netz mit Abzweigungen oder eine Kette?

mfg Chris


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

#10 23.05.2005 16:12:19

Lotipats
UltraMember
Registriert: 17.05.2005
Beiträge: 395

Re: Künstliche Neuronale Netze

Hallo,

einer der größten Vorteil, aber ein einer der größten Nachteile eines Neuronalen Netzes ist, dass das dem Programmierer (oder der Natur ;-) ) obliegt.

Es gibt alles mögliche an Netze. Ein Netz kann aus x Eingabe- und einer Ausgabeeinheit bestehen. Es ist auch möglich, dass ein Netz aus 5.000.000 Einheiten besteht.
Es gibt Rekursive Netze, bei denen y unterinander verbunden sind, so dass man immer wieder bei einem Neuron ankommen kann.
Es ist möglich, dass ALLE Neuronen untereinander verbunden sind, es ist möglich, dass alle von einer Schicht mit allen der nachfolgfenden Schicht verbunden sind. Es kann aber auch sein, dass immer nur ein Neuron mit einem anderen verbunden ist.

Es ist somit vieles möglich. Genau wie man verschiedene Varianten zum Trainieren hat, wie man die Gewichte eingrenzt, ob man sie überhaupt eingrenzt, ...

Hat dir das geholfen?

LOTIPATS

Offline

 

#11 25.05.2005 14:46:21

Lotipats
UltraMember
Registriert: 17.05.2005
Beiträge: 395

Re: Künstliche Neuronale Netze

Dann mal weiter:

Die Trainingsdaten sind mit dem Testdaten ähnlich, das ist eine Vorraussetzung, dass es eine erfolgreiche Identifikation gibt.
Ich habe geschrieben, dass beim Lernen das ganze so oft wiederhohlt wird, bis die Testdaten erfolgreich erkannt werden.
Jedoch gibt es auch die Möglichkeit, dass die Trainingsmenge (oder Lernmenge) x mal wiederhohlt wird und dabei die Gewichte angepasst werden. Danach wird die Testmenge durchgelaufen. Dies ist dann der spannende Moment, ist das Netz richitg trainiert? Diese Variante hat ihre Vor und Nachteile.
Vorteil:
Es kann nicht zu einer Endlosschleife kommen. Denn es ist möglich, dass die Testmenge von dem Netz nie richtig erkannt wird, egal wie oft es wiederhohlt wird.
Nachteil:
Es besteht sehr stark die Gefahr des "Übertrainieren", so dass das Netz nur noch die Lerndaten richtig erkännt, aber nichts anderes.

Ermitteln des Fehlers am Beispiel einer Ausgabeeinheit:
Man weis, was die eine Ausgabeeinheit haben sollte. Sagen wir z.B. es sollte 1,0 liefern. Der Schwellwert ist 0,78.
Das Neuron hat 2 Einheiten, die ihm die Daten geliefert hat. Sie haben die Gewichte w1 und w2.
w1 ist 0,32 und w2 ist 0,4. Beide Einheiten waren gereizt (Zahl 1). Somit hatte die Summe s=0,32*1+04*1, also s=0,72.
Somit ist die Differenz, bis das Neuron erregt wird, 0,06, die Gewichte muessen also erhöht werden.


Anpassen der Gewichte:

Variante1:
Es ist bekannt, welche Ausgabe jede Einheit haben sollte. Dann wird der Quadratische Gesammtfehler ermittelt (Summe aller Fehler² der einzelnen Einheiten). Danach werden die Gewichte mit Hilfe des Quadratischen Fehlers angepasst. Dafür gibt es Formeln.
Dieser ganze Vorgang gilt jedoch nur für wenige Netze. Deshalb moechte ich aber nicht weiter eingehen, man kann die Gewichte auch über andere Verfahren ändern, die ich noch ansprechen werde.

2.Variante:
hat man mehr als nur eine Schicht (Eingabes. nicht mitgerechnet), so kann man die oben angesprochene Variante nicht nutzen. Dafür gibt es das Backpropagation-Lernen.
Dabei geht man zuerst das Netz von Vorne nach hinten mit den "normalen" Eingabewerten ein. Bei der Ausgabeschicht wird für jedes Neuron der Fehler bestimmt. Folgend wird das Netz rückwärts durchgewandert, so als ob man das Netz umdreht. Der Fehler dient dabei als Eingabe. Damit können für jede Einheit die Gewichte angepasst werden.


Vaerandern der Gewichte:
auch hier gibt es verschiedene Varianten. Die einfachste ist, dass man
die Gewichte mit hilfe eines festen Betrages ändert, z.B. 0,0001. Es ist auch möglich zuerste mit einem großen Wert an zu fangen und dann die Änderung der Gewichte immer kleiner werden zu lassen. Der Ermittelte Fehler dient dann nur zu Entscheidung, ob das Gewicht erhöht oder verkleinert wird.
Man kann auch mit Hilfe des ermittelten Fehlers und der Differenzierung lösen (z.B. Delta-Regel), evtl. werde ich irgendwann nochmal auf die eingehen.
Im Normalfall verwendet die Backpropagation eine Generalisierung der Delta-Regeln nach Rumelhart et al. verwendet, die andern Varianten sollten aber auch funktionieren.


Falls jetzt keiner Fragen hat, so werde ich nächstes mal mit Beispielen anfangen.
Ist das OK?

LOTIPATS

Offline

 

#12 26.05.2005 08:28:30

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: Künstliche Neuronale Netze

Beispiele sind immer gut.
Soweit so gut. Im Moment hab ich noch ein paar kleine Unklarheiten aber ein Beispiel sollte das ganze lösen...
Wenn nicht frage ich.

mfg Chris


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

#13 28.05.2005 18:20:37

Lotipats
UltraMember
Registriert: 17.05.2005
Beiträge: 395

Re: Künstliche Neuronale Netze

Hallo,

da ich mir nicht sicher bin, wie lange ich fuer die ganzen Beispiele brauchen (Bilder zeichnen etc., habe ja auch noch andere Dinge zu tun) und ich auch erstmal wieder Vorne anfange (Neuron, ...) wäre es mir lieber, wenn ihr direkt und sofort eure Fragen stellt.

LOTIPATS
PS: Wie sieht eigentlich die Umstellung der Tutorials aus? Werden die Dinge verschoben, wird um ein neuschreiben (+ zusammenfassen, ordnen) gebeten? ...? ??  :?

Offline

 

#14 28.05.2005 20:31:19

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Künstliche Neuronale Netze

Zitat:

PS: Wie sieht eigentlich die Umstellung der Tutorials aus? Werden die Dinge verschoben, wird um ein neuschreiben (+ zusammenfassen, ordnen) gebeten? ...? ??

Umstellung welcher Tutorials? :? Wenn du ein Tutorial schreiben willst, gerne. big_smile


My software never has bugs. It just develops random features.

Offline

 

#15 30.12.2008 10:01:45

Lotipats
UltraMember
Registriert: 17.05.2005
Beiträge: 395

Re: Künstliche Neuronale Netze

So, der 03.06. ist rum *ehm* hmm
Und wie man es merkt, habe ich es nicht geschafft (und dann das Thema erst einmal ruhen lassen). sad

Nach über 3 Jahren habe ich das Thema wieder aufgegriffen und leider scheitere ich wieder an einer ähnlichen Stelle, obwohl ich jetzt, statt einem 3-Schichtigen Netz mit Klassen nur ein Einschichtiges mit Arrays.
Deshalb wollte ich euch um Rat fragen.

Ich fange mal von Vorne (und mit dem Programm von heute an):
Ich möchte eine Ziffernerkennung umsetzen. Dazu habe ich eine Komponente (PixelFeld) erstellt, die ein n*m-Feld aus Boolean-Werten umsetz (mit Maus setzen/wegnehmen/invertieren, Speichern + Laden).
Bild:
[kein Bild mehr]

Die funktioniert auch wunderbar.
Mein "Netz" speichere ich in einem 2D-Feld ab: NeuronalesNetz:array [0..9,0..62]of Real;
Da ich ein 7x9-Anzeigefeld habe benoetige ich auch 63 "Eingabeneuronen", die ich wegrationalisiert habe, und 10 Ausgabeneuronen. Mit den ersten Teil des Feldes (0-9) spreche ich die Ausgabeneuronen an, mit dem 2. Teil (0-62) die Gewichte der Eingabeneuronen des jeweiligen Ausgabeneurons (z.B. NeuronalesNetz[0][12] ist das Gewicht, dass das 13. Eingabeneuron im 0. Ausgabeneuron ist).
Bei mir soll immer genau ein Ausgabeneuron aktiv sein, wenn das Netz eine 0 erkennt soll das 0. aktiv sein u.s.w..
Als Aktivierungsfunktion nutze ich eine Schwellenwert Funktion, sobald das Neuron mehr als (oder gleich) den Schwellenwert als Eingabe erhält, ist es aktiv. Da Meine Eingabe nur 0 oder 1 sind (Feld ist weiß oder Feld ist Schwarz) läuft die Berechnung der Eingabe darauf hinaus, alle Gewichte der aktiven Eingabeneuronen aufzusummieren.

Da ich ein Einschichtiges Netz habe, verwende ich folgende Gewichtsaenderung:
Aenderung=Lernrate*(ZielWert-IstWert)*Eingabe
Dabei ist die Eingabe 1, sollte das Pixel schwarz sein, oder 0 wenn es weiß ist.
Der IstWert ist in meinem Fall die Summe der Gewichte der aktiven Eingabeneuronen und der ZielWert war testweise Schwellenwert oder 2*Schwellenwert wenn das Ausgabeneuron aktiv sein sollte, oder 0 bzw. -Schwellenwert, wenn es nicht aktiv sein sollte.
Die Lernrate war mal 0,5 und mal 0,3.
Nachdem einmal alle Lerndaten durchgelaufen sind, wiederholt man diesen Vorgang, dies habe ich 200 bzw. 2000 Mal gemacht. Beim Lernen verwende ich Lerndaten aus einem Buch, jeweils einmal eine 0 bis 9.
Nach jedem Durchlauf habe ich die Lernrate angepasst, entweder auf 3/4, 0,7, 0,95 oder 1,0 des aktuellen Wertes.

Bei der letzten Variante hauen mir die Gewichte offenbar ins unendliche ab, ich bekomme einen Gleitkommefehler. Dies war auch schon vor 3 Jahren das Problem (damals mit mehr Schichten und Backpropagations-Algorithmus zum Anpassen der Gewichte und Sigmoide-Funktion als Aktivierung). Ansonsten erkennt er gar keine, oder zu viele manchmal auch falsche Zahlen. Aktuell erkennt er bei der 9 z.B.  "2,5,7,9" (also die entsprechenden Neuronen sind aktiv) und bei der 7: "0,1,3,4,6,8". Ich schätze einfach mal, bei genügend Durchläufen werde ich auch bei angepasster Lernrate so einen Gleitkommezahlenüberlauf bekommen, oder er lernt gar nichts mehr.

War das soweit verständlich? Hat jmd. einen Denkfehler von mir gefunden?
Ein einzelnes Neuron kann den Raum nur in 2 Teile teilen (im 2D ist es eine Gerade, in 3D eine Ebene). Mit den 10 Neuronen in der Ausgabeschicht bekomme ich also 10 mal jeweils 2 Teile im 63-Dimensionalen Raum, denke ich. Es kann sein, dass so gar keine Ziffernerkennung möglich ist, kann ich mir Vorstellen. In dem Buch, das ich verwendet habe, hatten sie eine Fallstudie genommen, mit 63-6-9-Netz (63 Eingabeneuronen, eine verborgene Schicht mit 6 Neuronen und 9 Ausgabeneuronen, ist keins aktiv, so ist es 0). Aber ich war der Meinung, schon einmal eine Variante mit nur einer Schicht gesehen zu haben. Und da mich das aktuelle Problem stark an das von damals, mit noch mehr Schichten erinnert hat, dachte ich, ich frage hier mal nach. Vllt. kann mit ja DerPeer oder jmd. anderes Gewissheit geben.

LOTIPATS

PS: hier noch der (fast komplette, vllt. etwas unübersichtliche) Quelltext der Hauptdatei (ich bitte die teils daemliche Kommentare zu verzeihen):

Code: delphi

[...]
const
  schwellenwert:real=0.5;

type
  tneuroausgabe=array[0..9]of boolean;

  tform1 = class(tform)
    [...]
  public
    neuronalesnetz:array [0..9,0..62]of real;
    pixelfeld:tpixelfield;
    ort:string;             //Speicherort des Programms

    procedure initnetz();
    procedure lerne(maxruns:integer);
    procedure updateneurons(gewollteausgabe:tneuroausgabe;
      einfluss:real);
    function erkenne():integer;
    function erkenneex():string;
    function analysiere():tneuroausgabe;
    function berechneaktivierungswert(neuron:integer):real;
  end;
[...]

procedure tform1.beenden1click(sender: tobject);
begin
  //einfach das Hauptfenster schliessen, um das Prog. zu beenden
  close();
end;

procedure tform1.formcreate(sender: tobject);
begin
  //Zufallszahlengenerator an
  randomize();

  //eigene Position festlegen
  left:=200;
  top:=200;

  //Pixelfeld anlegen
  pixelfeld:=tpixelfield.create(form1);
  pixelfeld.parent:=form1;
  //Pos. setzen
  pixelfeld.left:=5;
  pixelfeld.top:=5;
  //Abmasse setzen
  pixelfeld.width:=140;
  pixelfeld.height:=180;
  //und sichtbar machen
  pixelfeld.visible:=true;

  //Orte der Datei-Dialoge setzen
  ort:=extractfilepath(expandfilename(application.exename));
  opendialog1.initialdir:=ort;
  savedialog1.initialdir:=ort;

  //Netz initialisieren
  initnetz();
end;

procedure tform1.laden1click(sender: tobject);
begin
  //Dateiladedialog ausfuehren
  if(opendialog1.execute())then
  begin
    pixelfeld.loadfromfile(opendialog1.filename);
  end;

end;

procedure tform1.neu1click(sender: tobject);
begin
  //und einfach alles neu anlegen
  pixelfeld.init();
  pixelfeld.refresh;
end;

procedure tform1.speichern1click(sender: tobject);
begin
  //Dateispeicherdialog ausfuehren
  if(savedialog1.execute())then
  begin
    if(not pixelfeld.savetofile(savedialog1.filename))then
      messagedlg('Die Datei konnte nicht unter den Namen "'+
        savedialog1.filename+'" gespeichert werden', mterror, [mbok], 0);
  end;

end;

procedure tform1.button1click(sender: tobject);
begin
  label1.caption:=erkenneex();
end;

procedure tform1.button2click(sender: tobject);
begin
  lerne(spinedit1.value);
end;

procedure tform1.initnetz();
var
  i,k:integer;
begin
  //das Netz mit zufallswerten fuellen
  //Neuronen durchgehen
  i:=0;
  while(i<length(neuronalesnetz))do
  begin
    //Gewichte der Neuronen durchgehen
    k:=0;
    while(k<length(neuronalesnetz[i]))do
    begin
      neuronalesnetz[i][k]:=0;//random();
      inc(k);
    end;
    inc(i);
  end;
end;

function tform1.erkenneex():string;
var
  aktivierung:tneuroausgabe;
  i:integer;
  zw:string;                //Zahl(en) zwischenspeichern
  mehrdeutig:boolean;
begin
  //initialisieren
  zw:='';
  mehrdeutig:=false;

  //Aktivierung berechnen
  aktivierung:=analysiere();

  //alles durchgehen und Ziffer merken
  i:=0;
  while(i<length(aktivierung))do
  begin
    //falls es aktiviert ist, so merken
    if(aktivierung[i])then
      //wurde sich noch nichts gemerkt?
      if(comparestr(zw,'')=0)then
        zw:=inttostr(i)
      else
      //es gibt mehrere "Erkennungen", also komme dazwischen und
      //Mehrdeutigkeit merken
      begin
        zw:=zw+', '+inttostr(i);
        mehrdeutig:=true;
      end;

    //naechste evtl. Aktivierung ueberpruefen
    inc(i);
  end;

  //Ergebnis setzen

  //gibt es keine Lsg? --> Ausgeben
  if(comparestr(zw,'')=0)then
    result:='Es konnte keine Lsg. gefunden werden!'
  else
    //ansonsten, gibt es mehrere?
    if(mehrdeutig)then
      result:='moegliche Lsg.: '+zw
    else
      result:=zw;

end;

function tform1.erkenne():integer;
var
  aktivierung:tneuroausgabe;
  i:integer;
begin
  //initialisieren
  result:=-1;

  //Aktivierung berechnen
  aktivierung:=analysiere();

  //alles durchgehen und Ziffer merken
  i:=0;
  while(i<length(aktivierung))and(result<>-2)do
  begin
    //falls es aktiviert ist, so merken
    if(aktivierung[i])then
      //wurde sich noch nichts gemerkt?
      if(result=-1)then
        result:=i
      else //es gibt mehrere "Erkennungen", also Mehrdeutigkeit merken
        result:=-2;

    //naechste evtl. Aktivierung ueberpruefen
    inc(i);
  end;
end;

function tform1.analysiere():tneuroausgabe;
var
  i:integer;
begin
  //Neuronen durchgehen
  i:=0;
  while(i<=high(neuronalesnetz))do
  begin
    //fuer jedes Neuron dessen Aktivierung berechnen und in Ausgabe speichern
    //es ist aktiviert, wenn der ermittelte Wert groesser als der Schwellenwert ist
    result[i]:=berechneaktivierungswert(i)>=schwellenwert;
    inc(i);
  end;
end;

function tform1.berechneaktivierungswert(neuron:integer):real;
var
  i:integer;
begin
  //alle Gewichte der gesetzten Felder aufaddieren
  i:=0;
  result:=0;
  while(i<=high(neuronalesnetz[neuron]))do
  begin
    //falls das Feld gesetzt ist, so dazu addieren
    if(pixelfeld.data[i div pixelfeld.rows][i mod pixelfeld.rows])then
      result:=result+neuronalesnetz[neuron][i];
    inc(i);
  end;
end;

procedure tform1.lerne(maxruns:integer);
var
  i:integer;
  gewollteausgabe:tneuroausgabe;
  echteausgabe:tneuroausgabe;
  einfluss:real;
begin
  //Variablen initialisieren
  //gewollte Ausgabe leeren
  i:=0;
  while(i<length(gewollteausgabe))do
  begin
    gewollteausgabe[i]:=false;
    inc(i);
  end;
  //Starteinfluss setzen
  einfluss:=0.3;


  //lernen, so lange, bis maxRuns zuende sind
  while(maxruns>0)do
  begin
    //schonmal Zaehler runterzaehlen
    dec(maxruns);
    label3.caption:=inttostr(maxruns);
    application.processmessages();

    //und nun alle Lerndaten durchgehen
    i:=0;
    while(i<10)do
    begin
      if(pixelfeld.loadfromfile(ort+'LernDaten_'+inttostr(i)+'.muster'))then
      begin
        //gewollte Ausgabe setzen
        gewollteausgabe[i]:=true;

        //Netz anpassen
        updateneurons(gewollteausgabe,einfluss);

        //und fuer den naechsten die gewollte Ausgabe entfernen
        gewollteausgabe[i]:=false;
      end;

      //und naechste Lerndaten nehmen
      inc(i);
    end;

    //Einfluss anpassen
    einfluss:=einfluss*0.95;
  end;

  showmessage(floattostr(neuronalesnetz[0][0]));

end;

procedure tform1.updateneurons(gewollteausgabe:tneuroausgabe; einfluss:real);
var
  i,k:integer;
  sollwert, delta, istwert:real;
  zw:integer;
begin
  //die Neuronen durchgehen
  i:=0;
  while(i<length(gewollteausgabe))do
  begin
    if(gewollteausgabe[7])and(i=7)then
    begin
      gewollteausgabe[i]:=true;
    end;
    //Sollwert ermitteln
    if(gewollteausgabe[i])then sollwert:=schwellenwert else sollwert:=0;
    //istWert festlegen
    istwert:=berechneaktivierungswert(i);
    //delta berechnen, mit delta=sollWert-istWert
    delta:=sollwert-istwert;

    //und die Gewichte anpassen
    k:=0;
    while(k<length(neuronalesnetz[i]))do
    begin
      //Eingabe fuer Neuron k ermitteln ermitteln
      if(pixelfeld.data[k div pixelfeld.rows][k mod pixelfeld.rows])then
        zw:=1
      else zw:=0;
      //und anpassen des Gewichtes k fuer das Neuron i
      //falls zw=0, so wird es keine Anpassung geben, das ist auch gut so
      //denn das hatte keinen Einfluss auf das Ergebnis!
      neuronalesnetz[i][k]:=neuronalesnetz[i][k]+einfluss*delta*zw;
      inc(k);
    end;

    inc(i);
  end;
end;

end.


EDIT(29.07.2012): Bild entfernt

Beitrag geändert von Lotipats (29.07.2012 08:51:11)

Offline

 

#16 31.12.2008 08:24:43

Lotipats
UltraMember
Registriert: 17.05.2005
Beiträge: 395

Re: Künstliche Neuronale Netze

Und sie dreht sich doch! *äh* Es lernt doch.

An 2 Stellen etwas manipulieren (+ eine weitere Funktion, die eine Anzahl ermittelt) und dann geht es. smile

LOTIPATS

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson