Netz Training

Sie sind sich nicht sicher, in welches Forum Ihre Frage oder Ihr Anliegen passt?
Möchten Sie ein neues Forum vorschlagen? Möchten Sie Kritik am Forum selbst üben?

Dann posten Sie bitte hier.
Post Reply
Negi
Posts: 14
Joined: Wed 8. Dec 2010, 15:23

Netz Training

Post by Negi »

Hallo,

ich habe mal wieder ein Problem :)

Und zwar geht es um folgen Code und das verhalten des Netzes dabei.

Code: Select all

ArrayList<String[]> data = rc.getDaten();



		// lade Prototyp.mbn
		MBDllWrapper.MBLoadNet("SmallTemperingOptimizer.mbn");

		//lade Lesson , falls vorhanden
		if (MBDllWrapper.MBGetLessonCount()>0)
		{
			MBDllWrapper.MBLoadLesson("Lesson.mbl");
		}


		// Name des Netzes wird der Lesson �bergeben
		MBDllWrapper.MBNamesFromNet();

  		// l�sche vorhandene Pattern
  		if (MBDllWrapper.MBGetLessonSize()<=1)
		{
			MBDllWrapper.MBDeletePattern();
		}

		for(int k=0; k<data.get(1).length;k++)

		{

		String auftragnr=data.get(1)[k];




		System.out.println("Auftragnummer=  "+auftragnr);
		System.out.println("------------------------------------------------------------");
		System.out.println("------------------------------------------------------------");


		// F�ge der Lesson Pattern hinzu
		MBDllWrapper.MBAddPattern();
		int Zeile = MBDllWrapper.MBGetLessonSize()-1;
		MBDllWrapper.MBSelectPattern(Zeile);
		System.out.println(Zeile+"Daten=  ");
		System.out.println("...................");
                String[] temp= new String[28];
                for(int i=0; i<temp.length;i++){

                    if(i<2){
                        temp[i]=data.get(k+3)[i];
                    }
                    else{
                        if(i<4){
                            temp[i]=data.get(k+3)[i+5];
                        }
                        else{

                                temp[i]=data.get(k+3)[i+6];


                        }
                    }
                }
				for ( int i=0; i<28; i++)
				{
					double neuronTrain = 0.0;
					try
					{
						if(i<26)
						{
							String inputSt=temp[i];
							neuronTrain = Double.parseDouble(inputSt);
							MBDllWrapper.MBSetPatternInput(i, neuronTrain);
							String inName = MBDllWrapper.MBGetLessonInputName(i);
							System.out.print(inName+"="+inputSt+" - ");
						}

						if(i>=26 && i<28)
						{
							int m=i-26;
							String inputSt=temp[i];
							neuronTrain = Double.parseDouble(inputSt);
							MBDllWrapper.MBSetPatternOutput(m, neuronTrain);
							String outName = MBDllWrapper.MBGetLessonOutputName(i);
							System.out.println("Output"+m+" ="+inputSt);

						}


					}
					catch
					(
						NumberFormatException e
					)  {}

				}
		}
		//Speichere Lesson
		MBDllWrapper.MBSaveLessonAs("Lesson.mbl");

		//lade TeacherDatei
		MBDllWrapper.MBLoadTeacherFile("Teachers.mbt");

		//wähle Lern-Algorithmus
		MBDllWrapper.MBSelectTeacher("RPROP");

		//Training
		double Net_Err = MBDllWrapper.MBGetLastNetError();
                
                long z=0;
		do
		{
			int  Step = MBDllWrapper.MBTeachStep();
			Net_Err = MBDllWrapper.MBGetLastNetError();
			System.out.println("Netz_Fehler: "+Net_Err);
			System.out.println("TeachStep: "+Step);
                        System.out.println(z++);
			System.out.println("");

		}
			while (Net_Err > 0.004);//legt genauigkeit fest

			//Stoppe das Trainieren
			MBDllWrapper.MBStopTeaching();
			MBDllWrapper.MBSaveNetAs("SmallTemperingOptimizer.mbn");
Wenn ich dabei 649 Tupel einfüge und das Netz lernen lasse, erreiche ich nie den Angestrebten Netzerror von 0.004, sondern der Netzerror pendelt sich bei 0.016 +/- 0.001 ein und bleibt dort seolbst nach 2 Tagen.

Meine Frage ist nun, was in diesem Quellcode falsch ist oder ob in dem Netz fehler sind (das Netz wurde nicht von mir entwickelt, ich soll es nur einbinden).
Wenn ich allerdings das Membrain Programm nutze und dort über den Autoteacher das Netz Trainiere, erreiche ich den erwünschten Netzerror.

Des weiteren würde ich gerne wissen, ab wievielen Pattern man davon ausgehen kann, dass das Netz bei neuen unbekannten Tupeln einem ein recht genaues Ergebniss liefern kann.(evtl gibts ja grobe fix Richtwerte)

Ich freue mich auf jede Antwort die mich einer Lösung näherbringen kann.

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

Re: Netz Training

Post by Admin »

Hallo Negi,

was mir als erstes merkwürdig in Deinem Code erscheint ist:

Code: Select all

 // l�sche vorhandene Pattern
      if (MBDllWrapper.MBGetLessonSize()<=1)
      {
         MBDllWrapper.MBDeletePattern();
      }
Ich denke, das erfüllt nicht ganz den Zweck, vorhandene Pattern zu löschen: Du löschst ja nur, wenn die Lesson nur 0 oder 1 Pattern enthält und auch dann löschst Du nur ein einziges Pattern.
Das sollte wohl eher so aussehen:

Code: Select all

      while (MBDllWrapper.MBGetLessonSize() > 0)
      {
         MBDllWrapper.MBDeletePattern();
      }
Allerdings scheint das nicht Dein Problem zu sein, Denn Du schreibst:
Negi wrote:Wenn ich allerdings das Membrain Programm nutze und dort über den Autoteacher das Netz Trainiere, erreiche ich den erwünschten Netzerror.
Verwendest Du dazu die Lesson, die Du mit Deinem Code erzeugt hast?

Welche Einstellungen verwendest Du denn in MemBrain bzgl. der Konfiguration des Net Errors (Menü Teach-->Configure Net Error Function...)?
Die Dll unterstützt momentan nur die EInstellung 'Squared Deviation / Mean of Sum'. Wenn der Net Error zwischen MemBrain und Dll vergleichbar sein soll, dann musst Du in MemBrain diese EInstellung wählen.

Ansonsten wäre noch wichtig, ob Du in MemBrain vor dem Training evtl. ein 'Randomize' durchführst (MemBrain fragt Dich i.d.R. danach), in der Dll scheinst Du das nicht zu tun (Dll Funktion RandomizeNet()).
Außerdem sehe ich in Deinem Code, dass Du nicht prüfst, ob das Laden der Teacher-Datei und das Auswählen des Teachers erfolgreich war:

Code: Select all

//lade TeacherDatei
      MBDllWrapper.MBLoadTeacherFile("Teachers.mbt");

      //wähle Lern-Algorithmus
      MBDllWrapper.MBSelectTeacher("RPROP");
Du ignorierst die Rückgabewerte dieser Funktionen.

Zuletzt könnte es sein, dass die Teacherdatei 'Teachers.mbt', die Du lädst, einen anders konfigurierten RPROP Teacher enthälkt, als er von MemBrain verwendet wird. Du musst die 'Teachers.mbt' aus dem MemBrain Teacher Manager heraus exportieren, falls noch nicht geschehen.

Löst etwas davon Dein Problem?

Viele Grüße
Thomas Jetter
Negi
Posts: 14
Joined: Wed 8. Dec 2010, 15:23

Re: Netz Training

Post by Negi »

Ok. Also das Randomize hat des Problem nun gelöst. Vielen dank für die schnelle Antwort.
Zum Thema LoadTeacher und SelectTeacher, dies sind void Funktionen und liefern in so fern keinerlei Werte zurück die man prüfen könnte.
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Netz Training

Post by Admin »

Negi wrote:Zum Thema LoadTeacher und SelectTeacher, dies sind void Funktionen und liefern in so fern keinerlei Werte zurück die man prüfen könnte.
Meinst Du die Funktionen aus der C# Wrapper-Klasse, die es auf der MemBrain Seite zu Download gibt?
Sie stammt zwar nicht von mir (sondern von einem MemBrain Benutzer), aber ich sehe darin die beiden Funktionen:

Code: Select all

/// Load a teacher file
        public Boolean MB_LoadTeacherFile(string filePath)
        {
            return (_MB_LoadTeacherFile(filePath) == EMBRetVal.MEMBRAIN_OK);
        }

        /// Select the active teacher by name
        public Boolean MB_SelectTeacher(string name)
        {
            return (_MB_SelectTeacher(name) == EMBRetVal.MEMBRAIN_OK);
        }


Diese sind beide Boolean, nicht 'void'.

Hast Du eine andere Version?

Auf jeden Fall schön, dass sich Dein eigentliches Problem erst mal gelöst hat.

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

Re: Netz Training

Post by Admin »

OK, sorry vielmals, ich habe wohl das Thema etwas verfehlt... Nicht um C# geht es, sondern um Java.

Und tatsächlich sind die beiden Funktionen 'void'.

Ich musste auch erst wieder reinschauen, wie die Vorgehensweise hier ist:

Wenn beim Ausführen einer DllWrapper Funktion ein Fehler auftritt, so merkt sich die Wrapper-Dll dies.

Ob ein Fehler aufgetreten ist, kann mann über die Methode

Code: Select all

GetLastError()
prüfen. Wenn hier 0 zurückgegeben wird, dann ist alles ohne Fehler abgelaufen. Ein Wert != 0 bedeutet einen Fehler.
Die Methode setzt den gemerkten Fehler automatisch auf 0 zurück, so dass man die Methode zu einem späteren Zeitpunkt wieder aufrufen und damit prüfen kann, ob in der Zwischenzeit wieder ein Fehler aufgetreten ist.
Es würde also z.B. Sinn machen, in Deiner Anwendung die Methode einmal aufzurufen, nachdem Deine ganzen Initialisierungen usw. abgearbeitet sind. So kannst Du mit einer einzigen Fehlerbehandlung sicherstellen, dass unterwegs nichts schief gegangen ist.

Viele Grüße
Thomas Jetter
Negi
Posts: 14
Joined: Wed 8. Dec 2010, 15:23

Re: Netz Training

Post by Negi »

Ahh ok ja. Hatte diese Funktion schon wieder vegessen. Aber nochmals danke für den Tipp.
Post Reply