5

Chciałbym wiedzieć, czy szkolenie z sieci neuronowej z algorytmami genetycznymi, optymalizacją cząstek i symulowanym wyżarzaniem przed użyciem treningu propagacji sprężystości poprawia wynik.Skorzystaj z wielu metod szkoleniowych, aby wyszkolić SSN z Encogiem

Oto kod używam:

    CalculateScore score = new TrainingSetScore(trainingSet); 
        StopTrainingStrategy stop = new StopTrainingStrategy(); 
        StopTrainingStrategy stopGA = new StopTrainingStrategy(); 
        StopTrainingStrategy stopSIM = new StopTrainingStrategy(); 
        StopTrainingStrategy stopPSO = new StopTrainingStrategy(); 

        Randomizer randomizer = new NguyenWidrowRandomizer(); 
        //Backpropagation train = new Backpropagation((BasicNetwork) network, trainingSet, 0.2, 0.1); 
        // LevenbergMarquardtTraining train = new LevenbergMarquardtTraining((BasicNetwork) network, trainingSet); 
        int population = 500; 
        MLTrain trainGA = new MLMethodGeneticAlgorithm(new MethodFactory(){ 
         @Override 
         public MLMethod factor() { 
          final BasicNetwork result = createNetwork(); 
          ((MLResettable)result).reset(); 
          return result; 
         }}, score,population); 


        Date dStart = new Date(); 

        int epochGA = 0; 
        trainGA.addStrategy(stopGA); 
        do{ 
         trainGA.iteration(); 
         if(writeOnStdOut) 
          System.out.println("Epoch GenetiC#" + epochGA + " Error:" + trainGA.getError()); 
         epochGA++;//0000001 
         previousError = trainGA.getError(); 
         Date dtemp = new Date(); 
         totsecs = ((double)(dtemp.getTime()-dStart.getTime())/1000); 
        } while(previousError > maximumAcceptedErrorTreshold && epochGA < (maxIterations/5) && !stopGA.shouldStop() && totsecs < (secs/3)); 

        NeuralPSO trainPSO = new NeuralPSO((BasicNetwork) network, randomizer, score, 100); 

        int epochPSO = 0; 
        trainPSO.addStrategy(stopPSO); 
        dStart = new Date(); 
        do{ 
         trainPSO.iteration(); 
         if(writeOnStdOut) 
          System.out.println("Epoch Particle Swarm #" + epochPSO + " Error:" + trainPSO.getError()); 
         epochPSO++;//0000001 
         previousError = trainPSO.getError(); 
         Date dtemp = new Date(); 
         totsecs = ((double)(dtemp.getTime()-dStart.getTime())/1000); 
        } while(previousError > maximumAcceptedErrorTreshold && epochPSO < (maxIterations/5) && !stopPSO.shouldStop() && totsecs < (secs/3)); 

        MLTrain trainSIM = new NeuralSimulatedAnnealing((MLEncodable) network, score, startTemperature, stopTemperature, cycles); 

        int epochSA = 0; 
        trainSIM.addStrategy(stopSIM); 
        dStart = new Date(); 
        do{ 
         trainSIM.iteration(); 
         if(writeOnStdOut) 
          System.out.println("Epoch Simulated Annealing #" + epochSA + " Error:" + trainSIM.getError()); 
         epochSA++;//0000001 
         previousError = trainSIM.getError(); 
         Date dtemp = new Date(); 
         totsecs = ((double)(dtemp.getTime()-dStart.getTime())/1000); 
        } while(previousError > maximumAcceptedErrorTreshold && epochSA < (maxIterations/5) && !stopSIM.shouldStop() && totsecs < (secs/3)); 




        previousError = 0; 
        BasicTraining train = getTraining(method,(BasicNetwork) network, trainingSet); 


        //train.addStrategy(new Greedy()); 
        //trainAlt.addStrategy(new Greedy()); 
        HybridStrategy strAnneal = new HybridStrategy(trainSIM); 

        train.addStrategy(strAnneal); 
        //train.addStrategy(strGenetic); 
        //train.addStrategy(strPSO); 

        train.addStrategy(stop); 
        // 
        // Backpropagation train = new Backpropagation((ContainsFlat) network, trainingSet, 0.7, 0.3); 
        dStart = new Date(); 

        int epoch = 1; 

        do { 
         train.iteration(); 
         if(writeOnStdOut) 
          System.out.println("Epoch #" + epoch + " Error:" + train.getError()); 
         epoch++;//0000001 
         if(Math.abs(train.getError()-previousError)<0.0000001) iterationWithoutImprovement++; else iterationWithoutImprovement = 0; 
         previousError = train.getError(); 

         Date dtemp = new Date(); 
         totsecs = ((double)(dtemp.getTime()-dStart.getTime())/1000); 
        } while(previousError > maximumAcceptedErrorTreshold && epoch < maxIterations && !stop.shouldStop() && totsecs < secs);//&& iterationWithoutImprovement < maxiter); 

Jak widać jest sekwencją algorytmów szkoleniowych powinna podnieść ogólną szkolenia.

Proszę dać mi znać, jeśli ma to sens i czy kod jest poprawny. Wygląda na to, że działa, ale chcę być pewien, ponieważ czasami widzę, że postęp dokonany przez GA jest resetowany z PSO.

Dzięki

Odpowiedz

1

Wydaje się logiczne, jednak nie zadziała.

Przy domyślnych parametrach RPROP sekwencja ta prawdopodobnie nie zadziała. Powodem jest to, że po poprzednim treningu wagi sieci neuronowej będą zbliżone do lokalnego optimum. Ze względu na bliskość lokalnego optimum tylko MALNE zmiany w wagach przybliżą się do optimum (obniżenie poziomu błędu). Domyślnie RPROP używa wartości InitialUpdate 0.1 w macierzy wagi. Jest to ogromna wartość dla sieci tak blisko optymalnej. W tym momencie "wypuszczasz byka w sklepie z porcelaną". Pierwsza iteracja spowoduje przesunięcie sieci daleko od optimum i zasadniczo rozpocznie nowe globalne wyszukiwanie.

Obniżenie wartości initialUpdate POWINIEN pomóc. Nie jestem pewien ile. Możesz przyjrzeć się średniej wartości aktualizacji wagi RPROP dla pociągu z danymi, aby uzyskać pomysł. Lub spróbuj ustawić go naprawdę mały i wracając do góry.

Powiązane problemy