/*--- formatted by Jindent 2.1, (www.c-lab.de/~jindent) ---*/

/*
 * JOONE - Java Object Oriented Neural Engine
 * http://joone.sourceforge.net
 */
package org.joone.samples.engine.xor;

import java.io.Serializable;
import java.util.Vector;
import org.joone.engine.*;
import org.joone.engine.learning.*;
import org.joone.engine.listeners.*;
import org.joone.net.*;
import org.joone.util.LearningSwitch;
import org.joone.samples.util.ParityInputSynapse;
import org.joone.io.*;

/**
 * Sample class to demostrate the use of the FahlmanTeacherSynapse and related classes.
 */
public class XORFahlman implements Serializable, NeuralNetListener, NeuralValidationListener {
    
    /** The NN. */
    private NeuralNet nnet = null;
    
    /** FIFO-queue to remember at which cycle the fahlman criterion was fullfilled. */
    private Vector validationCycles = new Vector();
    
    private long mills;
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        XORFahlman xor = new XORFahlman();
        xor.Go();
    }
    
    /**
     * Method declaration
     */
    public void Go() {
        // Firts, creates the three Layers
        LinearLayer	input = new LinearLayer();
        SigmoidLayer	hidden = new SigmoidLayer();
        SigmoidLayer	output = new SigmoidLayer();
        
        input.setLayerName("input");
        hidden.setLayerName("hidden");
        output.setLayerName("output");
        
        // sets their dimensions
        input.setRows(2);
        hidden.setRows(3);
        output.setRows(1);
        
        // Now create the two Synapses
        FullSynapse synapse_IH = new FullSynapse();	/* input -> hidden conn. */
        FullSynapse synapse_HO = new FullSynapse();	/* hidden -> output conn. */
        
        synapse_IH.setName("IH");
        synapse_HO.setName("HO");
        
        // Connect the input layer whit the hidden layer
        input.addOutputSynapse(synapse_IH);
        hidden.addInputSynapse(synapse_IH);
        
        // Connect the hidden layer whit the output layer
        hidden.addOutputSynapse(synapse_HO);
        output.addInputSynapse(synapse_HO);
        
        ParityInputSynapse inputStream = new ParityInputSynapse();
        inputStream.setParitySize(2); // size 2 equals XOR problem
        
        InputConnector myInputData = new InputConnector();
        myInputData.setInputSynapse(inputStream);
        myInputData.setAdvancedColumnSelector("1-2");
        
        InputConnector myInputValData = new InputConnector();
        myInputValData.setInputSynapse(inputStream);
        myInputValData.setAdvancedColumnSelector("1-2");
        
        LearningSwitch mySwitch = new LearningSwitch();
        mySwitch.addTrainingSet(myInputData);
        mySwitch.addValidationSet(myInputValData);
        input.addInputSynapse(mySwitch);
        
        FahlmanTeacherSynapse myFahlman = new FahlmanTeacherSynapse();
        
        InputConnector myDesiredData = new InputConnector();
        myDesiredData.setInputSynapse(inputStream);
        myDesiredData.setAdvancedColumnSelector("3");
        
        InputConnector myDesiredValData = new InputConnector();
        myDesiredValData.setInputSynapse(inputStream);
        myDesiredValData.setAdvancedColumnSelector("3");
        
        LearningSwitch myOutputSwitch = new LearningSwitch();
        myOutputSwitch.addTrainingSet(myDesiredData);
        myOutputSwitch.addValidationSet(myDesiredValData);
        
        TeachingSynapse trainer = new TeachingSynapse(myFahlman);
        trainer.setDesired(myOutputSwitch);
        
        // Connects the Teacher to the last layer of the net
        output.addOutputSynapse(trainer);
        
        nnet = new NeuralNet();
        nnet.addLayer(input, NeuralNet.INPUT_LAYER);
        nnet.addLayer(hidden, NeuralNet.HIDDEN_LAYER);
        nnet.addLayer(output, NeuralNet.OUTPUT_LAYER);
        nnet.setTeacher(trainer);
        nnet.getMonitor().setTrainingPatterns(4);
        nnet.getMonitor().setValidationPatterns(4);
        nnet.getMonitor().setTotCicles(10000);
        nnet.getMonitor().setLearning(true);
        nnet.getMonitor().setLearningRate(0.8);
        nnet.getMonitor().setMomentum(0.3);
        
        mills = System.currentTimeMillis();
        
        nnet.addNeuralNetListener(this);
        nnet.go();
    }
    
    /**
     * Method declaration
     */
    public void netStopped(NeuralNetEvent e) {
        long delay = System.currentTimeMillis() - mills;
        System.out.println("Training finished after "+delay+" ms");
        System.exit(0);
    }
    
    public void cicleTerminated(NeuralNetEvent e) {
        Monitor mon = (Monitor) e.getSource();
        long	c = mon.getCurrentCicle();
        // We validate each 200 epochs
        if (c % 200 == 0) {
            nnet.getMonitor().setExporting(true);
            NeuralNet myClone = nnet.cloneNet();
            nnet.getMonitor().setExporting(false);
            
            myClone.removeAllListeners();
            myClone.getMonitor().setParam(FahlmanTeacherSynapse.CRITERION, Boolean.TRUE);
            
            NeuralNetValidator myValidator = new NeuralNetValidator(myClone);
            myValidator.addValidationListener(this);
            validationCycles.add(new Integer(nnet.getMonitor().getTotCicles() - nnet.getMonitor().getCurrentCicle()));
            myValidator.start();
        }
    }
    
    /**
     * Method declaration
     */
    public void netStarted(NeuralNetEvent e) {
        System.out.println("Training...");
    }
    
    public void errorChanged(NeuralNetEvent e) {
        Monitor mon = (Monitor) e.getSource();
        long	c = mon.getCurrentCicle();
        if (c % 100 == 0) {
            System.out.println(c + " cycles remaining - Error = " + mon.getGlobalError());
        }
    }
    
    public void netStoppedError(NeuralNetEvent e,String error) {
    }
    
    public void netValidated(NeuralValidationEvent event) {
        Monitor myMonitor = ((NeuralNet)event.getSource()).getMonitor();
        
        if(myMonitor.getParam("FAHLMAN_CRITERION") != null &&
                ((Boolean)myMonitor.getParam("FAHLMAN_CRITERION")).booleanValue()) {
            if (nnet.isRunning()) {
                nnet.stop();
                System.out.println("Fahlman criterion fulfilled (at cycle "
                        + ((Integer)validationCycles.get(0)).intValue() + ")...");
            }
        }
        validationCycles.remove(0);
    }
    
}

 

Ads help maintain this website.