package org.joone.samples.engine.xor.rbf;

import org.joone.engine.*;
import org.joone.engine.learning.*;
import org.joone.io.*;
import org.joone.net.*;
import java.util.Vector;

/**
 * Very simple example of the Gaussian (static and random centers) RBF solving the XOR problem.
 *
 * @author Boris Jansen
 */
public class XOR_static_RBF implements NeuralNetListener {
    
    /** The neural network. */
    private NeuralNet nnet = null;
    
    /** The RBF hidden layer. */
    RbfGaussianLayer hidden = null;
    
    /** Synapses. */
    private MemoryInputSynapse inputSynapse, desiredOutputSynapse;
    private MemoryOutputSynapse outputSynapse;
    
    /** If the following flag is true, the centers will be chosen randomly.
     * Otherwise it will use predefined, fixed centers (able to solve the XOR
     * problem.
     */
    private boolean randomCenters = false;
    
    // XOR input
    private double[][] inputArray = new double[][] {
        {0.0, 0.0},
        {0.0, 1.0},
        {1.0, 0.0},
        {1.0, 1.0}
    };
    
    // XOR desired output
    private double[][] desiredOutputArray = new double[][] {
        {1.0},
        {0.0},
        {0.0},
        {1.0}
    };
    
    /**
     * Main
     *
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        XOR_static_RBF xor = new XOR_static_RBF();
        
        xor.initNeuralNet();
        xor.train();
        xor.test();
    }
    
    /**
     * Method declaration
     */
    public void train() {
        
        // set the inputs
        inputSynapse.setInputArray(inputArray);
        inputSynapse.setAdvancedColumnSelector("1,2");
        
        // set the desired outputs
        desiredOutputSynapse.setInputArray(desiredOutputArray);
        desiredOutputSynapse.setAdvancedColumnSelector("1");
        
        // get the monitor object to train or feed forward
        Monitor monitor = nnet.getMonitor();
        
        // set the monitor parameters
        monitor.setLearningRate(0.3);
        monitor.setMomentum(0.8);
        monitor.setTrainingPatterns(inputArray.length);
        monitor.setTotCicles(200);
        
        // RPROP parameters (uncomment if you want to use the RPROP learning algorithm)
        //monitor.getLearners().add(0, "org.joone.engine.RpropLearner");
        //monitor.setBatchSize(4);
        //monitor.setLearningMode(0);
        
        monitor.setLearning(true);
        nnet.addNeuralNetListener(this);
        nnet.go(true);
    }
    
    /**
     * Create and init the neural network.
     */
    protected void initNeuralNet() {
        // First create the three layers
        LinearLayer input = new LinearLayer();
        hidden = new RbfGaussianLayer();
        //SigmoidLayer output = new SigmoidLayer(); // you can try it (not a traditional RBF network)
        BiasedLinearLayer output = new BiasedLinearLayer();
        
        // set the dimensions of the layers
        input.setRows(2);
        hidden.setRows(2);
        output.setRows(1);
        
        if(!randomCenters) {
            // Use static Gaussian RBFs
            RbfGaussianParameters[] myParameters = new RbfGaussianParameters[2];
            double[] myMean0 = {0.0, 0.0};
            myParameters[0] = new RbfGaussianParameters(myMean0, Math.sqrt(.5));
            double[] myMean1 = {1.0, 1.0};
            myParameters[1] = new RbfGaussianParameters(myMean1, Math.sqrt(.5));
            hidden.setGaussianParameters(myParameters);
        }
        
        // Now create the two synapses
        RbfInputSynapse synapse_IH = new RbfInputSynapse(); /* input -> hidden conn. */
        FullSynapse synapse_HO = new FullSynapse(); /* hidden -> output conn. */
        
        // 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);
        
        // the input to the neural net
        inputSynapse = new MemoryInputSynapse();
        input.addInputSynapse(inputSynapse);
        if(randomCenters) {
            hidden.useRandomCenter(inputSynapse);
        }
        
        // The Trainer and its desired output
        desiredOutputSynapse = new MemoryInputSynapse();
        TeachingSynapse trainer = new TeachingSynapse();
        trainer.setDesired(desiredOutputSynapse);
        
        // Now we add this structure to a NeuralNet object
        nnet = new NeuralNet();
        
        nnet.addLayer(input, NeuralNet.INPUT_LAYER);
        nnet.addLayer(hidden, NeuralNet.HIDDEN_LAYER);
        nnet.addLayer(output, NeuralNet.OUTPUT_LAYER);
        nnet.setTeacher(trainer);
        output.addOutputSynapse(trainer);
    }
    
    public void test() {
        // attach a MemoryOutputSynapse to the output of the neural net
        outputSynapse = new MemoryOutputSynapse();
        nnet.getOutputLayer().addOutputSynapse(outputSynapse);
        nnet.getMonitor().setTotCicles(1);
        nnet.getMonitor().setTrainingPatterns(4);
        nnet.getMonitor().setLearning(false);
        nnet.removeAllListeners();
        nnet.go();
        
        System.out.println("Outputs");
        System.out.println("-------");
        for(int i = 0; i < 4; i++) {
            double[] myPattern = outputSynapse.getNextPattern();
            System.out.println("Output: " + myPattern[0]);
        }
        
        System.out.println("Centers RBF neurons: ");
        RbfGaussianParameters[] myParams = hidden.getGaussianParameters();
        for(int i = 0; i < myParams.length; i++) {
            String myText = (i+1) + ": [center: ";
            for(int j = 0; j < myParams[i].getMean().length; j++) {
                myText += myParams[i].getMean()[j] + ", ";
            }
            myText += "Std dev: " + myParams[i].getStdDeviation() + "]";
            System.out.println(myText);
        }
    }
    
    public void cicleTerminated(NeuralNetEvent e) {
    }
    
    public void errorChanged(NeuralNetEvent e) {
        Monitor mon = (Monitor)e.getSource();
        if (mon.getCurrentCicle() % 100 == 0)
            System.out.println("Epoch: "+(mon.getTotCicles()-mon.getCurrentCicle())+" RMSE:"+mon.getGlobalError());
    }
    
    public void netStarted(NeuralNetEvent e) {
    }
    
    public void netStopped(NeuralNetEvent e) {
    }
    
    public void netStoppedError(NeuralNetEvent e, String error) {
    }
    
}

 

Ads help maintain this website.