/*
 * ValidationSample.java
 *
 * Created on 11 november 2002, 22.59
 * @author  pmarrone
 */

package org.joone.samples.engine.validation;

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

/**
 * This example shows how to check the training level of the net
 * using a validation data source.
 * In this example we will learn to use the following objects:
 * - org.joone.util.LearningSwitch
 * - org.joone.net.NeuralNetValidator
 * - org.joone.util.NormalizerPlugIn
 *
 * This program shows how to build the same kind of neural net as that
 * contained into the org/joone/samples/editor/scripting/ValidationSample.ser
 * file using only java code and the core engine's API. Open that net in
 * the GUI editor to see the architecture of the net built in this example.
 */
public class SimpleValidationSample implements NeuralNetListener, NeuralValidationListener {
    
    NeuralNet net;
    long startms;
    private static String filePath = "org/joone/samples/engine/validation";
    
    /** Creates a new instance of SampleScript */
    public SimpleValidationSample() {
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        SimpleValidationSample sampleNet = new SimpleValidationSample();
        sampleNet.initialize(filePath);
        sampleNet.start();
    }
    
    private void initialize(String path) {
        /* Creates the three layers and connect them */
        LinearLayer ILayer = new LinearLayer();  // Input Layer
        SigmoidLayer HLayer = new SigmoidLayer(); // Hidden Layer
        SigmoidLayer OLayer = new SigmoidLayer(); // Output Layer
        ILayer.setRows(13); // The input pattern has 13 columns
        HLayer.setRows(4);
        OLayer.setRows(1);  // The desired pattern has 1 column
        FullSynapse synIH = new FullSynapse();
        FullSynapse synHO = new FullSynapse();
        this.connect(ILayer, synIH, HLayer);
        this.connect(HLayer, synHO, OLayer);
        
        /* Creates all the required input data sets */
        FileInputSynapse ITdata = this.createInput(path+"/wine.txt",1,2,14); /* The input training data set */
        FileInputSynapse IVdata = this.createInput(path+"/wine.txt",131,2,14); /* The input validation data set */
        FileInputSynapse DTdata = this.createInput(path+"/wine.txt",1,1,1); /* The desired training data set */
        FileInputSynapse DVdata = this.createInput(path+"/wine.txt",131,1,1); /* The desired validation data set */
        
        /* Creates and attach the input learning switch */
        LearningSwitch Ilsw = this.createSwitch(ITdata, IVdata);
        ILayer.addInputSynapse(Ilsw);
        
        /* Creates and attach the desired learning switch */
        LearningSwitch Dlsw = this.createSwitch(DTdata, DVdata);
        TeachingSynapse ts = new TeachingSynapse(); // The teacher of the net
        ts.setDesired(Dlsw);
        OLayer.addOutputSynapse(ts);
        
        /* Now we put all togheter into a NeuralNet object */
        net = new NeuralNet();
        net.addLayer(ILayer, NeuralNet.INPUT_LAYER);
        net.addLayer(HLayer, NeuralNet.HIDDEN_LAYER);
        net.addLayer(OLayer, NeuralNet.OUTPUT_LAYER);
        net.setTeacher(ts);
        
        /* Sets the Monitor's parameters */
        Monitor mon = net.getMonitor();
        mon.setLearningRate(0.4);
        mon.setMomentum(0.5);
        
        mon.setTrainingPatterns(130);
        mon.setValidationPatterns(48);
        
        mon.setTotCicles(1000);
        mon.setLearning(true);
    }
    
    /** Creates a FileInputSynapse */
    private FileInputSynapse createInput(String name, int firstRow, int firstCol, int lastCol) {
        FileInputSynapse input = new FileInputSynapse();
        input.setInputFile(new File(name));
        input.setFirstRow(firstRow);
        if (firstCol != lastCol)
            input.setAdvancedColumnSelector(firstCol+"-"+lastCol);
        else
            input.setAdvancedColumnSelector(Integer.toString(firstCol));
        
        // We normalize the input data in the range 0 - 1
        NormalizerPlugIn norm = new NormalizerPlugIn();
        if (firstCol != lastCol)
            norm.setAdvancedSerieSelector("1-"+Integer.toString(lastCol-firstCol+1));
        else
            norm.setAdvancedSerieSelector("1");
        norm.setMin(0.1);
        norm.setMax(0.9);
        input.addPlugIn(norm);
        return input;
    }
    
    /** Connects two Layers with a Synapse */
    private void connect(Layer ly1, Synapse syn, Layer ly2) {
        ly1.addOutputSynapse(syn);
        ly2.addInputSynapse(syn);
    }
    
    /* Creates a LearningSwitch and attach to it both the training and
       the desired input synapses */
    private LearningSwitch createSwitch(StreamInputSynapse IT, StreamInputSynapse IV) {
        LearningSwitch lsw = new LearningSwitch();
        lsw.addTrainingSet(IT);
        lsw.addValidationSet(IV);
        return lsw;
    }
    
    private void start() {
        // Registers itself as a listener
        net.getMonitor().addNeuralNetListener(this);
        startms = System.currentTimeMillis();
        net.go();
    }
    
    /* Events */
    public void netValidated(NeuralValidationEvent event) {
        // Shows the RMSE at the end of the cycle
        NeuralNet NN = (NeuralNet)event.getSource();
        System.out.println("    Validation Error: "+NN.getMonitor().getGlobalError());
    }
    
    public void cicleTerminated(NeuralNetEvent e) {
        // Prints out the cycle and the training error
        int cycle = net.getMonitor().getTotCicles() - net.getMonitor().getCurrentCicle()+1;
        if (cycle % 200 == 0) { // We validate the net every 200 cycles
            System.out.println("Cycle #"+cycle);
            System.out.println("    Training Error:   " + net.getMonitor().getGlobalError());
            
            // Creates a copy of the neural network
            net.getMonitor().setExporting(true);
            NeuralNet newNet = net.cloneNet();
            net.getMonitor().setExporting(false);
            
            // Cleans the old listeners
            // This is a fundamental action to avoid that the validating net
            // calls the cicleTerminated method of this class
            newNet.removeAllListeners();
            
            // Set all the parameters for the validation
            NeuralNetValidator nnv = new NeuralNetValidator(newNet);
            nnv.addValidationListener(this);
            nnv.start();  // Validates the net
        }
    }
    
    public void errorChanged(NeuralNetEvent e) {
//        Monitor NN = (Monitor)e.getSource();
//        System.out.println("    Actual training error: "+NN.getGlobalError());
    }
    
    public void netStarted(NeuralNetEvent e) {
    }
    
    public void netStopped(NeuralNetEvent e) {
        System.out.println("Stopped after "+(System.currentTimeMillis()-startms)+" ms");
    }
    
    public void netStoppedError(NeuralNetEvent e,String error) {
    }
    
}

 

Ads help maintain this website.