2015-04-30 19 views
5

Come posso mettere in pausa un algoritmo genetico in Encog 3.4 (la versione attualmente in sviluppo in Github)?Come posso mettere in pausa/serializzare un algoritmo genetico in Encog?

Sto usando la versione Java di Encog.

Sto cercando di modificare l'esempio Lunar fornito con Encog. Voglio mettere in pausa/serializzare l'algoritmo genetico e quindi continuare/deserializzare in una fase successiva.

Quando chiamo train.pause(); restituisce semplicemente null - che è abbastanza evidente dal codice dal momento che il metodo restituisce sempre null.

Suppongo che sarebbe piuttosto semplice poiché potrebbe esserci uno scenario in cui voglio allenare una rete neurale, usarla per alcune previsioni e poi continuare ad allenarmi con l'algoritmo genetico man mano che ottengo più dati prima di riprendere con più previsioni - senza dover ricominciare la formazione dall'inizio.

Si noti che non sto tentando di serializzare o mantenere una rete neurale, ma piuttosto l'intero algoritmo genetico.

risposta

4

Non tutti i formatori in Encog supportano la semplice pausa/ripresa. Se non lo supportano, restituiscono null, come questo. L'addestratore di algoritmi genetici è molto più complesso di un semplice formatore di propagazione che supporta la pausa/ripresa. Per salvare lo stato dell'algoritmo genetico, è necessario salvare l'intera popolazione, nonché la funzione di calcolo del punteggio (che può essere o non essere serializzabile). Ho modificato l'esempio di Lunar Lander per mostrarti come puoi salvare/ricaricare la tua popolazione di reti neurali per farlo.

Si può vedere che allena 50 iterazioni, quindi round-trip (carica/salva) l'algoritmo genetico, quindi allena altri 50.

package org.encog.examples.neural.lunar; 

import java.io.File; 
import java.io.IOException; 

import org.encog.Encog; 
import org.encog.engine.network.activation.ActivationTANH; 
import org.encog.ml.MLMethod; 
import org.encog.ml.MLResettable; 
import org.encog.ml.MethodFactory; 
import org.encog.ml.ea.population.Population; 
import org.encog.ml.genetic.MLMethodGeneticAlgorithm; 
import org.encog.ml.genetic.MLMethodGenomeFactory; 
import org.encog.neural.networks.BasicNetwork; 
import org.encog.neural.pattern.FeedForwardPattern; 
import org.encog.util.obj.SerializeObject; 

public class LunarLander { 

    public static BasicNetwork createNetwork() 
    { 
     FeedForwardPattern pattern = new FeedForwardPattern(); 
     pattern.setInputNeurons(3); 
     pattern.addHiddenLayer(50); 
     pattern.setOutputNeurons(1); 
     pattern.setActivationFunction(new ActivationTANH()); 
     BasicNetwork network = (BasicNetwork)pattern.generate(); 
     network.reset(); 
     return network; 
    } 

    public static void saveMLMethodGeneticAlgorithm(String file, MLMethodGeneticAlgorithm ga) throws IOException 
    { 
     ga.getGenetic().getPopulation().setGenomeFactory(null); 
     SerializeObject.save(new File(file),ga.getGenetic().getPopulation()); 
    } 

    public static MLMethodGeneticAlgorithm loadMLMethodGeneticAlgorithm(String filename) throws ClassNotFoundException, IOException { 
     Population pop = (Population) SerializeObject.load(new File(filename)); 
     pop.setGenomeFactory(new MLMethodGenomeFactory(new MethodFactory(){ 
      @Override 
      public MLMethod factor() { 
       final BasicNetwork result = createNetwork(); 
       ((MLResettable)result).reset(); 
       return result; 
      }},pop)); 

     MLMethodGeneticAlgorithm result = new MLMethodGeneticAlgorithm(new MethodFactory(){ 
      @Override 
      public MLMethod factor() { 
       return createNetwork(); 
      }},new PilotScore(),1); 

     result.getGenetic().setPopulation(pop); 

     return result; 
    } 


    public static void main(String args[]) 
    { 
     BasicNetwork network = createNetwork(); 

     MLMethodGeneticAlgorithm train; 


     train = new MLMethodGeneticAlgorithm(new MethodFactory(){ 
      @Override 
      public MLMethod factor() { 
       final BasicNetwork result = createNetwork(); 
       ((MLResettable)result).reset(); 
       return result; 
      }},new PilotScore(),500); 

     try { 
      int epoch = 1; 

      for(int i=0;i<50;i++) { 
       train.iteration(); 
       System.out 
         .println("Epoch #" + epoch + " Score:" + train.getError()); 
       epoch++; 
      } 
      train.finishTraining(); 

      // Round trip the GA and then train again 
      LunarLander.saveMLMethodGeneticAlgorithm("/Users/jeff/projects/trainer.bin",train); 
      train = LunarLander.loadMLMethodGeneticAlgorithm("/Users/jeff/projects/trainer.bin"); 

      // Train again 
      for(int i=0;i<50;i++) { 
       train.iteration(); 
       System.out 
         .println("Epoch #" + epoch + " Score:" + train.getError()); 
       epoch++; 
      } 
      train.finishTraining(); 

     } catch(IOException ex) { 
      ex.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     int epoch = 1; 

     for(int i=0;i<50;i++) { 
      train.iteration(); 
      System.out 
        .println("Epoch #" + epoch + " Score:" + train.getError()); 
      epoch++; 
     } 
     train.finishTraining(); 

     System.out.println("\nHow the winning network landed:"); 
     network = (BasicNetwork)train.getMethod(); 
     NeuralPilot pilot = new NeuralPilot(network,true); 
     System.out.println(pilot.scorePilot()); 
     Encog.getInstance().shutdown(); 
    } 
} 
+0

Grazie mille, questo spiega e dimostra il concetto. Ma dopo aver caricato l'algoritmo genetico non ottengo una buona risposta, sembra che devo allenare l'algoritmo genetico almeno una volta prima chiamo 'train.getMethod()'. E una nota sulla tua risposta, penso che tu stia allenando la rete neurale 50 volte due volte (cioè 100 volte) dopo averla caricata di nuovo - non 50 volte. – Tmr

+1

Sì, l'esempio sopra lo allena 50 volte, poi salva/carica e si allena altre 50 volte. GA utilizza un'intera popolazione di reti neurali, chiamando getMethod che restituisce la rete neurale più alta dalla popolazione, quindi non sarà troppo utile fino a quando la GA non si sarà allenata. – JeffHeaton