Prozessoptimieren

Sie haben ein bestimmtes Projekt zu bearbeiten und wissen nicht, wie Sie an die Aufgabe heran gehen sollen? Sie sind sich nicht sicher, ob Ihr Netzentwurf zu Ihrem Problem passt oder ob es da Optimierungsmöglichkeiten gibt? Ist es überhaupt sinnvoll an Ihre Daten mit einem NN basierten Ansatz heranzugehen? Ist MemBrain das richtige Werkzeug für Ihr Problem und Ihre Infrastruktur?

Hier ist der richtige Platz für diese Art von Fragen.
jojo
Posts: 12
Joined: Mon 27. Apr 2009, 12:40

Re: Prozessoptimieren

Post by jojo »

Hallo,

das mit den Skripten habe ich jetzt einigermaßen verstanden, zumindest kann ich sie auf meine anderen Netze anwenden 8-) und es erspart einiges an Zeit... vielen Dank für den Tipp
.
Allerdings ist mir dabei aufgefallen, dass bei dem Skript "Traintime" mein NetErorr sehr viel größer ist, als bei den Lessons. Wenn ich nur nur die Lessons Train und Vali eingebe und anschließend das Netz trainiere bekomme ich einen richtig guten NetError. Wenn ich die Skripte, mit dem gleichen Datensatz verwende, ist er um einiges höher. Woran kann das liegen?

Äh... und noch eine Frage. Ich beende meine Trainingszeit bei dem Skript "Traintime" mit <Stop Teach> Kann ich dann anschließend mein "Thinking"-Skript aufrufen? Ist das Thinking.as dann auch automatisch trainiert oder muss ich da noch etwas abspeichern?

Ich habe meine Datensätze nochmal erweiter... wegen dem schlechten NetError habe ich dann noch eine Hidden-Schicht eingefügt. Ist das so ok?

Gruß jojo
User avatar
Seppy
Posts: 47
Joined: Fri 5. Dec 2008, 04:48
Location: 90537 Feucht

Re: Prozessoptimieren

Post by Seppy »

Hallo Jojo,
der niedrige NetError beim manuellen laden der Lessons liegt vermutlich daran, daß Du die NetError Lesson NICHT auf deine Validaten eingestellt hast.
Dir wurde (ziemlich sicher) der NetError und Chart der Trainingslesson angezeigt, und der sieht immer sehr gut/niedrig aus.
(Genau das soll ein Script vermeiden, ist das Script einmal fehlerfrei, läuft es IMMER FEHLERFREI).

Ganz einfach:
Du hast im Lessoneditor drei Zahlen mit Pfeilen daneben.

1. Number of Lessons = Die Anzahl Deiner Lessons/Dateien.
2. Currently Edited (Training) Lesson = Die aktive (für's training/thinking) verwendete Lesson/Datei.
3. Net Error Lesson = Die Lesson/Datei auf die der NetError berechnet und die beiden Charts (NetError Viewer/Pattern Error Viewer) angezeigt werden.

Ausgangslage:
Lesson 1 = Training
Lesson 2 = Vali-Daten

Dann mußt Du im Lessoneditor folgende Zahlen stehen haben:

Number of Lessons = 2
Currently Edited (Training) Lesson = 1
Net Error Lesson = 2
Das geht aber nur, wenn Du bei "Set Manually" einen Haken rein machst.

Das Script Load.as macht genau das gleiche:

-----------------------------------------
const string Net_File = "Neu.mbn";
const string Train_Lesson = "Train.csv";
const string Vali_Lesson = "Vali.csv";
const string Think_Lesson = "Think.csv";

void main()
{
OpenNet(Net_File); = Öffne Dein Netz
SetLessonCount(4); = Anzahl Lessons = 4
SelectLesson(4); = Aktiviere Lesson 4
ClearLesson(); = Lösche alle Patterns/Daten aus Lesson 4
SelectLesson(1); = Aktiviere Lesson 1
ImportLessonRaw(Train_Lesson); = Importiere in Lesson 1 die Daten der Datei "Train_Lesson" (Wurde oben durch Variable angegeben).
SelectLesson(2); = Aktiviere Lesson 2
ImportLessonRaw(Vali_Lesson); = Importiere in Lesson 2 die Daten der Datei "Vali_Lesson" (Wurde oben durch Variable angegeben).
SelectLesson(3); = Aktiviere Lesson 3
ImportLessonInputsRaw(Think_Lesson); = Importiere in Lesson 3 die Daten der Datei "Think_Lesson" (Wurde oben durch Variable angegeben).
SelectLesson(1); = Aktiviere Lesson 1 (Zum trainieren/lernen)
SelectNetErrLesson(2); = (UND DAS IST WICHTIG) Der Net Error wird für Lesson 2/ZWEI berechnet, also die Validierungsdatei (Dem Netz unbekannte Daten).
ShowLessonEditor(false); = Der Lessoneditor wird NICHT angezeigt.
}
-----------------------------------------

Sobald Du auf "Teach > Stop Teacher (Auto)" klickst, wird das Script Traintime beendet/abgebrochen (Das Netz wird auch NICHT abgespeichert).
Die Lessons bleiben weiterhin geladen, was Du danach machst bleibt Dir überlassen.
Das Script "Traintime" startet NUR den Teacher (Mit den zuvor geladenen Lessons "Load.as") und giebt jedesmal wenn das Netz besser als zuvor trainiert wurde, eine Zeile mit dem erreichten minimalen Net Error und der Zeit, nach wieviel Sekunden dieser erreicht wurde im Tracewindows aus.
(Erscheint also längere Zeit keine neue Zeile, ich würde mal sagen 5 - 10 Minuten, wird es auch KEINEN SINN mehr machen, das Netz nochmal 24 Stunden zu trainieren ; ES WIRD NICHT MEHR BESSER).
Du kannst Traintime auch mal längere Zeit laufen lassen (eine Nacht lang), aber bei mir ist der beste NetError immer innerhalb 1-2 Minuten erreicht.
(Ist natürlich abhängig von: Deinen Daten, Teacher, Anzahl Neuronen, Anzahl Hidden Schichten u.s.w.).

Zu den Hidden Schichten:
Also ich hab darüber gelesen, daß man nur für SEHR WENIGE PROBLEME eine 3. Schicht braucht.
Für die MEISTEN Probleme reicht sogar EINE Schicht.
Aber da hilft nur immer wieder ausprobieren.
Auch für die Anzahl Neuronen in einer Schicht giebt es KEINE FORMEL oder änliches.
Aber fang KLEIN an min. 3 Neuros und dann nach und nach erweitern (Weniger ist hier tatsächlich MEHR).

Dann hab ich noch gesehen, daß Du CSV und MBL Dateien hast, welche ist die AKTUELLE ?
Dein Script "Load.as" läd immer noch die CSV's .....
Vielleicht lags auch daran, daß Du manuell die AKTUELLEREN MBL-Dateien geladen hast, und "Load.as" die ALTEN CSV-Dateien geladen hat ???
Wenn Du die "MemBrainLessons/MBL Dateien" laden willst, mußt Du das "Raw" im Script-Befehl weglassen.

Aus:
ImportLessonRaw("Train.csv");

Muß dann werden:
ImportLesson("Train.mbl");

Beim "thinking" solltest Du aufpassen, ich hab in meiner "Think.csv" NUR EINE Zeile stehen.
Hast Du mehrere Zeilen drin, wird bei jedem "Denkvorgang/thinking" das Netz verändert, die zweite thinking-Zeile arbeitet also schon NICHT MEHR mit dem zuvor trainierten Netz, sondern mit dem durch Think-1 veränderten Netz.
Also entweder immer nur eine Zeile in die Thinkdatei, oder das TRAINIERTE Netz vor jedem think neu laden...

ich hoffe das hilft Dir weiter.

Gruß Seppy
Wer arbeitet macht Fehler, wer wenig arbeitet macht wenig Fehler, wer nicht arbeitet macht keine Fehler, wer keine Fehler macht wird befördert.
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Prozessoptimieren

Post by Admin »

Hallo Seppy und Jojo,

ein paar kleine Anmerkungen hätte ich noch beizusteuern:
Seppy wrote:Wenn Du die "MemBrainLessons/MBL Dateien" laden willst, mußt Du das "Raw" im Script-Befehl weglassen.

Aus:
ImportLessonRaw("Train.csv");

Muß dann werden:
ImportLesson("Train.mbl");
Das ist nicht ganz richtig, es muss 'LoadLesson("Train.mbl")' heißen, wenn mbl-Dateien geladen werden sollen. 'ImportLesson' lädt hingegen Dateien aus dem MemBrain-eigenen, speziellen CSV-Format (ich habe es 'Sectioned CSV' Format genannt).
Im Prinzip gilt das Folgende bzgl. Vor- und Nachteilen der Formate:
mbl Format:
*Schnellste Lade/Speicherzeit, kann ohne Probleme auch mit riesigen Datenmengen umgehen.
*Benötigt beim Laden keine vor-formatierte Lesson im Lesson-Editor, da alle Informationen bzgl. In/Output-Namen enthalten sind.
*In der Regel kleinste Dateigröße
*Keine Probleme beim Austausch zwischen Rechnern unterschiedlicher Ländereinstellungen
--> Solange man die Daten nicht lesbar in der Datei braucht immer das optimale Dateiformat. Kann aber nur mit MemBrain geöffnet werden. Von dort muss man in CSV exportieren, wenn man die Daten lesbar haben will.

Raw CSV Format:
*Lesbares Format
*Austausch mit vielen anderen Programmen (z.B. Excel)
*Format abhängig von den Ländereinstellungen des Rechners
*Enthält keine Informationen über die Anzahl der In-und Outputs. Deshalb klappt der Raw CSV Import nur, wenn die Lesson im Lesson-Editor so vor-formatiert ist, dass die Anzahl der Ein- und Ausgänge zur gewünschten Spaltenaufteilung in der CSV-datei passt. Das kann man z.B. durch 'Names From Net' erreichen.

MemBrain Sectioned CSV Format
*Lesbares Format
*Austausch mit anderen Programmen (z.B. Excel). Allerdings hat man dann in z.B. Excel noch weitere Textzellen im Tabellenblatt, also nicht nur die eigentlichen Daten.
*Benötigt beim Laden keine vor-formatierte Lesson im Lesson-Editor, da alle Informationen bzgl. In/Output-Namen enthalten sind.
*Format abhängig von den Ländereinstellungen des Rechners

Seppy wrote:Beim "thinking" solltest Du aufpassen, ich hab in meiner "Think.csv" NUR EINE Zeile stehen.
Hast Du mehrere Zeilen drin, wird bei jedem "Denkvorgang/thinking" das Netz verändert, die zweite thinking-Zeile arbeitet also schon NICHT MEHR mit dem zuvor trainierten Netz, sondern mit dem durch Think-1 veränderten Netz.
Also entweder immer nur eine Zeile in die Thinkdatei, oder das TRAINIERTE Netz vor jedem think neu laden...
Das ist für Dich, Seppy, korrekt, da Du ein zeitvariantes Netz hast (Du arbeitest ja mit Zeitreihen). Jojo hat aber ein einfacheres, zeitinvariantes Netz. D.h., bei einem 'Think' ist es Jojos Netz vollkommen egal, was vorher der interne Netzzustand war. Wenn man an Jojos Netz Input-Daten anlegt und dann 'Think' ausführt, kommt also immer das selbe heraus, solange man das Netz nicht durch training verändert, unabhängig davon, wie viele andere 'Thinks' vorher durchgeführt wurden.
jojo wrote:Ist das Thinking.as dann auch automatisch trainiert oder muss ich da noch etwas abspeichern?
Also zunächst mal wird nie ein Skript trainiert, sondern natürlich nur das Netz. Letzteres ist nach dem Beenden von Traintime.as trainiert und bleibt es auch. D.h., Du kannst sofort mit 'Think' loslegen. Bevor Du MemBrain schließt solltest Du eben speichern, wenn das Netz gut trainiert wurde. Das Netz wird dann natürlich auch in trainiertem Zustand abgespeichert. Du musst also nicht jedesmal wenn Du das Netz lädtst neu trainieren, falls Du das meinen solltest...


Viele Grüße,
Thomas
Thomas Jetter
jojo
Posts: 12
Joined: Mon 27. Apr 2009, 12:40

Re: Prozessoptimieren

Post by jojo »

Hallo...

Der Unterschied zwischen den lessons-dateien und den skripten war mir schon klar. ich wollt nur mal beide Varianten ausprobieren, schließlich befinde ich mich ja noch in der findungsphase :P
Und da ist mir eben der unterschiedliche NetError aufgefallen. Aber seppy hatte recht, ich habe das Häcken bei Set Manually vergessen. Ich habe es nachträglich noch eingefügt und nun stimmen beide Varianten überein. Jetzt zeigen nämlich beide einen scheiß NetError an :roll:

Deswegen habe ich auch noch ein paar Fragen :oops: .

1. Wann ist mein Netz denn gut trainiert und wann kann ich es benutzen? Muss der NetError mindesten unter eins sein? Ich weiß es hängt von den Trainigsdaten ab. Aber was ist wenn mir keine anderen zur Verfügung stehen?

2. Soll ich dem Netz zum trainieren mehrer kleine Datensätze oder einen großen ( so wie ich es jetzt getan habe) präsentieren oder macht das keinen unterschied?

3. Bringt es eigentlich etwas, wenn ich das Skript mit den Trainigsdaten öfter durchlaufen lasse?

4. Was sagt der NetError eigentlich genau aus?

5. Ich habe im Moment einen NetError von ca. 1,2. Soll ich jetzt warten, bis mir mehr Daten zur Verfügung stehen oder kann ich mit dem Netz schon weiter arbeiten? Ich habe halt nicht endlos Zeit, das Ende ist schon bald in Sicht :?

Viele Grüße
jojo
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Prozessoptimieren

Post by Admin »

jojo wrote:1. Wann ist mein Netz denn gut trainiert und wann kann ich es benutzen? Muss der NetError mindesten unter eins sein? Ich weiß es hängt von den Trainigsdaten ab. Aber was ist wenn mir keine anderen zur Verfügung stehen?
Im Prinzip hängt es sogar vielmehr davon ab, was für Dich akzeptable Validierungsergebnisse sind. An einem festen Net-Error kannst Du das nicht so leicht festmachen, es hängt davon ab, was Du mit Deinem Netz in Deiner Anwendung erreichen willst.
Du wirst also nicht umhin kommen, Dir selbst Akzeptanzkriterien vorzugeben. Das kann wahrscheinlich nicht auf Basis des Net-Errors geschehen. Vielmehr wird Du Dir die Validierungsergebnisse in eine Lesson aufzeichnen und dann im Detail anschauen müssen. Ein Kriterium könnte sein, wie hoch der maximale Ausreißer bei irgendeinem Datensatz sein darf. Oder wie hoch die Standardabweichung sein darf etc.
Wie Du die Validierungsdaten in eine Lesson aufzeichnest, steht in der MemBrain-Hilfe unter 'Validating Your Net'. Dort ist auch ein kleines Skriptbeispiel angegeben, das genau das tut.
Die eigentliche Analyse und Beurteilung der Ergebnisse kannst Du aber nur selbst durchführen, sie hängt direkt von Deiner Problemstellung und den dafür gestellten Anforderungen ab.
jojo wrote:2. Soll ich dem Netz zum trainieren mehrer kleine Datensätze oder einen großen ( so wie ich es jetzt getan habe) präsentieren oder macht das keinen unterschied?
Nimm einen großen Datensatz anstatt mehrerer kleiner.
jojo wrote:3. Bringt es eigentlich etwas, wenn ich das Skript mit den Trainigsdaten öfter durchlaufen lasse?
Ich weiß jetzt nicht, was das Skript genau tut. Ein Netz mehrfach zu trainieren kann manchmal etwas bringen, wenn man es vorger immer zufällig initialisiert (also Randomize) benutzt. Manchmal ist die eine zufälligere Initialisierung günstiger als die andere. Das ist allerdings eher selten. Natürlich macht es immer Sinn, nachzutrainieren, wenn man neue Daten hat. Hier kann man beides versuchen: Vorher zufällig initialisieren oder nicht. Im ersteren Fall, vergisst das Netz erstmal alles und erlernt alles neu. Im zweiten Fall wird der bereits trainierte Stand verwendet und nur an die neuen Daten angepasst (was natürlich viel schneller ist).
Eine Besonderheit bzgl. des Teachers 'RPROP' möchte ich hier noch erwähnt haben: Dieser Teacher hat keine feste Lernrate (Schrittweite bei der Gewichtsanpassung), sondern passt die Lernrate während des Trainings dynamisch an. Sie wird immer kleiner, je näher sich das Netz an die Trainingsdaten anpasst. Deshalb reagiert ein trainiertes Netz nach dem Start des RPROP Teachers erst einmal mit einem kurzen Anstieg des Net-Error, da die Schrittweiten des Teachers für dieses bereits trainiert Netz viel zu groß sind. Das fängt sich i.d.R. aber sehr schnell wieder.
jojo wrote:4. Was sagt der NetError eigentlich genau aus?
Mathematisch ist der Net-Error die Summe aller QUADRIERTEN Abweichungen über alle Pattern der zugrunde liegenden Lesson und über alle Ausgangsneuronen des Netzes. Ersteigt also mit der Anzahl der Pattern in der Lesson und mit der Anzahl der Ausgangsneuronen und hat damit keine fest zuzuordnende Bedeutung. Anders gesagt: Wenn Deine Lesson, auf die sich der Net-Error bezieht, 10000 Datensätze hat, dann ist ein Net-Error von 2 wesentlich besser, als wenn Du diesen Net-Error bzgl. einer Lesson mit nur 100 Datensätzen erhältst.
Wenn Du eine normalisierte Aussage haben willst, dann musst Du den Net Error durch die Anzahl Pattern in der Lesson teilen. So kannst Du z.B. den Net Error bzgl. der Trainingslesson mit dem bzgl. der Validierungslesson vergleichen: Einfach während des Trainings die eingestellte 'Net Error Lesson' umschalten und den Net-Error beobachten (er springt natürlich bei der Umschaltung). Den jeweiligen Wert durch die jeweilige Anzahl Pattern teilen. Damit wird die Qualität der Validierung mit der Qualität des Trainings in Verbindung gesetzt. Das Training wird meist besser sein als die Validierung, das ist normal. Wenn der normalisierte Net-Error bei der Validierung dem Net Error der Training-Lesson nahe kommt, dann bedeutet das, dass Dein Netz gut generalisiert.
Wäre eine sinnvolle Erweiterung für die Zukunft: Den Net-Error optional normalisiert anzeigen zu lassen...
jojo wrote:5. Ich habe im Moment einen NetError von ca. 1,2. Soll ich jetzt warten, bis mir mehr Daten zur Verfügung stehen oder kann ich mit dem Netz schon weiter arbeiten? Ich habe halt nicht endlos Zeit, das Ende ist schon bald in Sicht :?

Wenn Du momentan keine weiteren Daten hast, dann arbeite 'schon mal weiter'. Was heißt denn das bei Dir konkret? Was wären Deine nächsten Schritte?

Viele Grüße,
Thomas
Thomas Jetter
jojo
Posts: 12
Joined: Mon 27. Apr 2009, 12:40

Re: Prozessoptimieren

Post by jojo »

Hallo,

ich brauche dringen eure Hilfe. Ich habe mich längere Zeit nicht mehr um mein Netz gekümmert, da ich noch an einem anderen Projekt arbeite. Jetzt ist es aber soweit, dass ich mir Gedanken darüber machen sollte wie ich meine Ergebnisse darstellen möchte.

Ich habe meinen Datensatz einmal genauer betrachtet und ihn anschließend selektiert. Beispielswiese habe ich alle Produktionstage ausgeblendet, bei denen es Abweichung in der Rohwarenzusammenstellung gab. Außerdem gibt es zwei Schmelzanlagen, von denen immer nur eine in Betrieb ist.

Ich dachte mir also, dass ich die Datenmenge nach Anlage und Rohwaren aufteile und dann neuronale Netze erstelle. Anschließend verlgeiche ich die Neterror miteinander bzw. teile ich den Net Error zuvor durch die Anzahl von Pattern.

Damit kann ich die Verglichen ob es unterschiede zwischen den Anlagen gibt bzw. ob der Net Error sich verschlechtert wenn ich die Datensätze mit den Rohwarenabweichung hinzunehme. Oder ob er sich verschlechter wenn ich alle Daten einem Netz präsentiere...

Was haltet ihr davon? Kann man das so machen oder haltet ihr das für blödsinnig???

Wie kann ich denn beweisen, dass mein Netz auch wirklich funktioniert?? ich hab mir mal einen Output berechnen lass, in dem ich eine bekannten Datensatz eingeben habe. Anschließend habe ich den Output des Netzes mit dem tatsälichen Wert verglichen. Die beiden Werte zeigten große Abweichung. Ist das ein Zeichen, dass mein Netz schlecht generalisiert ist?

Gruß
Johanna
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Prozessoptimieren

Post by Admin »

Hallo Johanna,

hier meine Analyse Deiner Daten:
Da ich die jüngste Entstehungsgeschichte Deiner Daten nicht kenne und auch die 'Think'-Lesson leer war, habe ich zunächst alle Deine Trainings- und Validierungsdaten nochmal zusammengeworfen und mit MemBrain davon 90% Trainings- und 10% Validierungsdaten per Zufall abgespaltet.

Mittels eines Skripts, das ich basierend auf 'Seppys Basis-Skript' hier aus dem Forum erstellt habe, habe ich mir dann angesehen, wie Dein Netz generalisiert. Es war schon gar nicht schlecht. Ich habe noch eine weitere Schicht eingefügt und Links, die eine Schicht überspringen, das hat das Ergebnis weiter verbessert.

Wenn Du Dir den angefügten Sceenshot von der Validierung einmal ansiehst, dann hoffe ich, dass Du nicht mehr ganz so schwarz siehst, ich finde das Ergebnis sehr passabel. 100% Übereinstimmung wirst Du niemals bekommen, ein Netz kann immer höchstens gut 'raten', dazu ist es schließlich da. Mit Deiner begrenzten Anzahl Trainingsmuster ist das ein ansehnliches Ergebnis.

Das Skript in seiner momentanen Konfiguration trainiert maximal 60s. Nach dieser Zeit, oder wenn vorher ein Net Error von 0.1 (basierend auf der Validierungslesson) erreicht wird, bricht es das Training ab. Wenn dann in der 'Think.csv' Input-Daten-Zeilen stehen (anstatt wie momentan nur eine Überschriftenzeile), dann wird das Skript die zu diesen Inputs gehörenden Output-Werte über das Netz berechnen und alles in einer Datei 'Output.csv' speichern. Diese wird anschließend auch noch geöffnet sofern Du das Öffnen von csv-Dateien bei Dir mit einer Anwendung verknüpft hast (z.B. Excel).
Das Skript kannst Du oben in einem gut kommentierten Abschnitt sehr flexibel konfigurieren.

Du musst einfach das zip-File entpacken (es entsteht ein neues Verzeichnis) und das Skript 'Basis.as' von MemBrain aus aufrufen (über 'Scripting'-'Execute Script...'). Alles andere geschieht von selbst.
jojo wrote:Damit kann ich die Verglichen ob es unterschiede zwischen den Anlagen gibt bzw. ob der Net Error sich verschlechtert wenn ich die Datensätze mit den Rohwarenabweichung hinzunehme. Oder ob er sich verschlechter wenn ich alle Daten einem Netz präsentiere...

Was haltet ihr davon? Kann man das so machen oder haltet ihr das für blödsinnig???
Das kann man sehr gut machen, klingt für mich nach einer sehr sinnvollen Vorgehensweise.
jojo wrote:Wie kann ich denn beweisen, dass mein Netz auch wirklich funktioniert??
Ein mathematischer Beweis ist unmöglich. Du kannst nur demonstrieren, dass Dein Netz gut generalisiert durch Validierung (wie oben durch das Skript bewerkstelligt). Wenn Du den Erfolg der Validierung genauer darstellen willst, dann kopierst Du am besten die 'Vali.csv', löschst aus der Kopie die Spalte mit dem Output-Neuron, und speicherst die Datei als 'Think.csv'. Wenn Du nun das Skript laufen lässt, wird am Ende eine 'Output.csv' entstanden sein, die Deine Validierungsergebnisse (Pattern) enthält. Diese kannst Du dann detailiiert mit den Vorgabedaten aus 'Vali.csv' vergleichen, Standardabweichungen, Min- Max- Abweichungen usw. bestimmen, alles was man halt in der Statistik so treiben kann.
jojo wrote:ich hab mir mal einen Output berechnen lass, in dem ich eine bekannten Datensatz eingeben habe. Anschließend habe ich den Output des Netzes mit dem tatsälichen Wert verglichen. Die beiden Werte zeigten große Abweichung. Ist das ein Zeichen, dass mein Netz schlecht generalisiert ist?
Das kann ich so erst einmal nicht nachvollziehen. An einem einzelnen Output kannst Du aber nichts festmachen, einzelne Ausreiser musst Du immer mal in Kauf nehmen bei einem NN.

Viele Grüße, hoffe das hilft weiter!
Attachments
Validation.jpg
(105.35 KiB) Downloaded 26 times
ScriptVorschlagTJ.zip
(109.48 KiB) Downloaded 541 times
Thomas Jetter
jojo
Posts: 12
Joined: Mon 27. Apr 2009, 12:40

Re: Prozessoptimieren

Post by jojo »

Hallo,

ich habe mal für den Output einen anderen Parameter gewählt. Wenn ich diesen Wert voraussagen würde, könnte ich mein Prozess besser steuern. Allerding lässt sich mein Netz bei diesem nicht so gut generalisieren als bei dem Output Netz von 27.08. Obwohl es sich um die Selben Daten handelt nur die Output wurden vertauscht.

Mein NetError sinkt zu Beginn und steigt dann aber wieder stark an. Woran kann das liegen?

Gruß Johanna
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Prozessoptimieren

Post by Admin »

Hallo Johanna,
jojo wrote:Allerding lässt sich mein Netz bei diesem nicht so gut generalisieren als bei dem Output Netz von 27.08. Obwohl es sich um die Selben Daten handelt nur die Output wurden vertauscht.

Mein NetError sinkt zu Beginn und steigt dann aber wieder stark an. Woran kann das liegen?
Es ist nicht nur die Generalisierungsfähigkeit, die fehlt, das Netz kann bereits die Trainings-Daten nicht sehr gut erlernen (siehe Anhänge).
Das bedeutet, aus Sicht des Netzes gibt es keine Möglichkeit, aus Deinen Eingangsdaten eindeutig auf einen Ausgangswert zu schließen.
Oder anders formuliert: Deine Daten sind aus Sicht des Netzes widersprüchlich, es scheinen Trainingsbeispiele mit identischen oder sehr ähnlichen Eingangsdaten, aber unterschiedlichen Ausgangsdaten vorhanden zu sein. Das bedeutet im Hinblick auf Deinen Prozess:
1.) Die Cremer-Drehzahl hat einen nur sehr begrenzten Einfluß auf das Ergebnis. Du erhältst also für identische restliche Parameter mit unterschiedlichen Drehzahlen den selben Käse. Damit kann das Netz Dir natürlich auch keine Cremer-Drehzahl vorhersagen, da es sich zwischen den verschiedenen Optionen 'nicht entscheiden' kann.
ODER
2.) Dir fehlen noch andere Eingangsparameter, die zusammen mit der Cremer-Drehzahl und den übrigen Parametern die Käsequalität bestimmen. Wie sieht es denn z.B. mit der Dauer der Cremer-Behandlung aus, war die immer die selbe? Ich könnte mir vorstellen, das diese eine erhebliche Rolle spielt.


Viele Grüße
Attachments
ValidationResult.jpg
(98.55 KiB) Downloaded 30 times
TrainResult.jpg
(107.02 KiB) Downloaded 27 times
Thomas Jetter
Post Reply