Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Neuronales Netz (https://www.delphipraxis.net/207952-neuronales-netz.html)

AmonAddy 19. Mai 2021 17:41

Neuronales Netz
 
Hallo,

ich bin neu hier im Forum, aber mit Delphi schon etwas vertraut (mit grundlegenden Dingen). Deshalb wollte ich mich ans Thema neuronale Netze werfen und ein kleines einfaches Demoprogramm schreiben. Die Neuronen erhalten erregende oder hemmende Signale (ansonsten sind die Verbindungen zwischen den Neuronen ungewichtet). Ein- und Ausgaben sind stets 0 oder 1. Das kleine Netz (<30 Zellen) soll graphisch dargestellt werden (deshalb Delphi). Das ganze soll eher zum Vertsändnis für neuronale Netze beitragen, aber muss nicht großartig als neuronales Netz eine Aufgabe (wie Zahlenerkennung) o.ä. konkret bewältigen können.

Ich habe mir eine extra Klasse TNeurom erstellt, mit der man einfach Neuronen erstellen und deren Schwellenwerte anpassen kann. Soweit so gut, das klappt auch zufriedenstellend. Allerdings habe ich Probleme (und keine Idee), wie ich daraus ein Netz bauen soll, d.h. wie die Daten zwischen den Neuronen übertragen werden sollen (welche Datenstruktur etc.).

Die Klasse zum Darstellen der Neuronen und Verarbeiten deren Daten habe ich so aufgebaut:

Code:
 TNeuron = class(TObject)
    private
      FX, FY, FD: integer;
      FFarbe: TColor;
      FBesitzer: TForm;
      FSchwelle: single;
      FSchwelleEdit: TNumEdit;
      FEingSignale: TSignale; //Eingehende Signale: erste Zeile: Wert; zweite Zeile: inhibitorische Leitung (0) oder exzitatorische Leitung (1)
      FEin: integer;
      FAus: integer;
      FAusLabel: TLabel;
      FP: TPanel;
      FPB: TPaintBox;
    protected
      procedure FSchwelleEditKeyPress(Sender: TObject; var Key: Char);
    public
      constructor Create(xPos, yPos: Integer; Durchmesser: Integer; F: TColor; Besitzer: TForm; Panel: TPanel; PtBox: TPaintBox);
      destructor Destroy; override;
      procedure Zeichnen;
      procedure Eingabe(Ein: TSignale);
      procedure Ausgabe;
      property Ausgabewert: integer read FAus;
      property Left: integer read FX;
      property Top: integer read FY;
      property Durchmesser: integer read FD;
      property Farbe: TColor read FFarbe;
  end;
Hat da jemand vielleicht eine Idee?

himitsu 19. Mai 2021 17:58

AW: Neuronales Netz
 
Noch eine Liste/Array mit den Verbindungen

entweder in jedes Neuron
oder eine gemeinsame Liste mit den NeuronPaaren

AmonAddy 19. Mai 2021 18:06

AW: Neuronales Netz
 
Okay, aber wie könnte man dann die Daten weitergeben? Wenn zb Neuron X seine Daten aus 5 vorhergehenden bezieht, dann wären in dem Array diese Neuronen genannt (ich ordne sie zur Laufzeit alle in einem Array an), aber wie kommt X an an die Daten?

Frickler 19. Mai 2021 18:13

AW: Neuronales Netz
 
Zitat:

Zitat von AmonAddy (Beitrag 1489792)
Okay, aber wie könnte man dann die Daten weitergeben? Wenn zb Neuron X seine Daten aus 5 vorhergehenden bezieht, dann wären in dem Array diese Neuronen genannt (ich ordne sie zur Laufzeit alle in einem Array an), aber wie kommt X an an die Daten?

Was sind denn "die Daten"? Die Property "Ausgabewert"? Da musst Du ja nur in einer Schleife das Neuronenarray durchgehen und für das aktuelle Element den "Ausgabewert" auslesen.

himitsu 19. Mai 2021 18:18

AW: Neuronales Netz
 
Also, du kannst zwar ein TArray<TNeuron> oder TList<TNeuron> in jedes Neuron einfügen, welche die Quelle der Daten sind,

aber andersrum ist es bestimmt auch nett, also ein Array/Liste mit den Neuronen, welche Daten erhalten,
denn dann kannst beim Durchgehen die Daten von dort weitergeben, wo du grade bist, anstatt sie abzuholen.



Empfehlen würde ich in jedem Neuron auch je einen Speicher für alten Wert und neuen Wert, da du dann beim Durchgehen der Neuronen so mit dem alten/vorhergehenden Werten rechnen kannst.

hstreicher 19. Mai 2021 18:26

AW: Neuronales Netz
 
Hier mal eine Videoserie zu Neural Netzwerken mit Delphi

https://chapmanworld.com/2017/09/20/...tworks-part-1/

mfg Hannes

AmonAddy 19. Mai 2021 18:33

AW: Neuronales Netz
 
Zitat:

Zitat von Frickler (Beitrag 1489793)
Was sind denn "die Daten"? Die Property "Ausgabewert"? Da musst Du ja nur in einer Schleife das Neuronenarray durchgehen und für das aktuelle Element den "Ausgabewert" auslesen.

Ja, die Daten bekommt ein einzelnes Neuron aus der Property "Ausgabewert" mehrerer vorangegangener Neuronen. Meine Schierigkeit (ich kann mir das alles schlecht vorstellen) besteht im Aufbau des Netzes:

Wenn ich das Programm starte, wird das Netz angelegt. Die Neuronen sind dann in einem Array of TNeuron gespeichert (wie in den Schichten). Ich suche jetzt eine effiziente Möglichkeit, sowohl Neuronen als auch Verbindungen zu definieren. Denn die Ausgabe unterscheidet sich auch noch je nachdem, ob die Verb. erregend oder hemmend ist. Ich müsste also den weitergegebenen Daten neben ihrem Wert (0 oder 1) auch noch die Erregung der Verbindung beifügen. Allerdings können ja die Verbindungen unterschiedlich sein: Wenn mein Netz jetzt grundlegend so aussieht:
Code:
A  C
B  D
Dann sind A und B jeweils mit C und D verbunden. Nun kann aber die Verbindung AC erregend, und AD hemmend sein und abhängig davon unterscheidet sich die Ausgabe. Und mir fällt kein Weg ein, diese Erregung mit dem eigentlichen Wert unter einen Hut zu bringen, zumal sich die Neuronenanzahl je Schicht auch immer unterscheiden kann.


Zitat:

Zitat von himitsu (Beitrag 1489795)
Also, du kannst zwar ein TArray<TNeuron> oder TList<TNeuron> in jedes Neuron einfügen, welche die Quelle der Daten sind,

aber andersrum ist es bestimmt auch nett, also ein Array/Liste mit den Neuronen, welche Daten erhalten,
denn dann kannst beim Durchgehen die Daten von dort weitergeben, wo du grade bist, anstatt sie abzuholen.



Empfehlen würde ich in jedem Neuron auch je einen Speicher für alten Wert und neuen Wert, da du dann beim Durchgehen der Neuronen so mit dem alten/vorhergehenden Werten rechnen kannst.

Wie könnte man dieses Abholen/Weitergeben am besten umsetzen?

Jens01 20. Mai 2021 11:15

AW: Neuronales Netz
 
So vor anderthalb Jahren habe ich mal so ein KI-System mit RPROP geschrieben und wollte es auch immer veröffentlich. Tja noch nicht geschafft.
Ich habe für die Verbindungen eine Klasse TVerbindung geschaffen. Dort waren u.a. die 2 angebundenen Neuronen, eine Verbindungsnummer und das Gewicht enthalten.
Die Verbindungen habe ich in eine Liste gepackt.
(ich hoffe, ich erinnere mich richtig ;) )

Das ist noch mein alter Ansatz mit FANN (aber mit grafischer Darstellung)
https://github.com/Jens01/NewFann

AmonAddy 24. Mai 2021 11:00

AW: Neuronales Netz
 
Vielen Dank! Mit dem Ansatz habe ich es hinbekommen. :-D

TurboMagic 24. Mai 2021 20:05

AW: Neuronales Netz
 
Zitat:

Zitat von Jens01 (Beitrag 1489832)
So vor anderthalb Jahren habe ich mal so ein KI-System mit RPROP geschrieben und wollte es auch immer veröffentlich. Tja noch nicht geschafft.

Was würde noch zu einer Veröffentlichung fehlen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:26 Uhr.
Seite 1 von 2  1 2      

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