package org.joone.samples.engine.parity;
import java.util.Vector;
import org.joone.engine.*;
import org.joone.engine.learning.*;
import org.joone.engine.listeners.*;
import org.joone.io.*;
import org.joone.log.*;
import org.joone.net.*;
import org.joone.structure.Nakayama;
/**
* Sample class to show the working of the technique for optimizing activation
* functions.
*
* @author Boris Jansen
*/
public class Parity_Structure_Nakayama implements NeuralNetListener, java.io.Serializable {
/** Logger for this class. */
private static final ILogger log = LoggerFactory.getLogger(Nakayama.class);
private NeuralNet nnet = null;
private MemoryInputSynapse inputSynapse, desiredOutputSynapse;
private MemoryOutputSynapse outputSynapse;
/** Optimizer. */
private Nakayama nakayama;
// Parity input
private double[][] inputArray = new double[][] {
{0.0, 0.0, 0.0, 0.0},
{0.0, 0.0, 0.0, 1.0},
{0.0, 0.0, 1.0, 0.0},
{0.0, 0.0, 1.0, 1.0},
{0.0, 1.0, 0.0, 0.0},
{0.0, 1.0, 0.0, 1.0},
{0.0, 1.0, 1.0, 0.0},
{0.0, 1.0, 1.0, 1.0},
{1.0, 0.0, 0.0, 0.0},
{1.0, 0.0, 0.0, 1.0},
{1.0, 0.0, 1.0, 0.0},
{1.0, 0.0, 1.0, 1.0},
{1.0, 1.0, 0.0, 0.0},
{1.0, 1.0, 0.0, 1.0},
{1.0, 1.0, 1.0, 0.0},
{1.0, 1.0, 1.0, 1.0}
};
// Parity desired output
private double[][] desiredOutputArray = new double[][] {
{0.0},
{1.0},
{1.0},
{0.0},
{1.0},
{0.0},
{0.0},
{1.0},
{1.0},
{0.0},
{0.0},
{1.0},
{0.0},
{1.0},
{1.0},
{0.0}
};
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
Parity_Structure_Nakayama parity = new Parity_Structure_Nakayama();
parity.initNeuralNet();
parity.train();
}
/**
* Method declaration
*/
public void train() {
// set the inputs
inputSynapse.setInputArray(inputArray);
inputSynapse.setAdvancedColumnSelector("1-4");
// 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.setUseRMSE(false);
monitor.setLearningRate(0.5);
monitor.setMomentum(0.3);
monitor.setTrainingPatterns(inputArray.length);
monitor.setTotCicles(5000);
monitor.setLearning(true);
// RPROP parameters
monitor.addLearner(0, "org.joone.engine.RpropLearner");
monitor.addLearner(1, "org.joone.engine.BatchLearner");
monitor.addLearner(2, "org.joone.engine.BasicLearner");
monitor.setBatchSize(inputArray.length);
monitor.setLearningMode(2);
// Nakayama networks work only in multi-thread mode
monitor.setSingleThreadMode(false);
nnet.addNeuralNetListener(this);
nnet.go();
}
private void test() {
nnet.getMonitor().setTotCicles(1);
nnet.getMonitor().setLearning(false);
// Nakayama networks work only in multi-thread mode
nnet.getMonitor().setSingleThreadMode(false);
// Enables the MemoryOutputSynapse in order to get the results of the network
outputSynapse.setEnabled(true);
nnet.removeAllListeners();
nnet.go(true);
Vector patts = outputSynapse.getAllPatterns();
System.out.println("\nResults:");
for(int i = patts.size(); i > 0; i--) {
Pattern pattern = (Pattern)patts.elementAt(patts.size() - i);
System.out.println("Output Pattern #"+(patts.size() - i)+" = " + pattern.getArray()[0]);
}
System.out.println("Final RMSE: " + nnet.getMonitor().getGlobalError());
}
/**
* Method declaration
*/
protected void initNeuralNet() {
// First create the three layers
LinearLayer input = new LinearLayer();
SigmoidLayer hiddenSigmoid = new SigmoidLayer();
SineLayer hiddenSine = new SineLayer();
GaussLayer hiddenGauss = new GaussLayer();
SigmoidLayer output = new SigmoidLayer();
// set the dimensions of the layers
input.setRows(4);
hiddenSigmoid.setRows(8);
hiddenSine.setRows(8);
hiddenGauss.setRows(8);
output.setRows(1);
// Now create the synapses
FullSynapse synapse_IHSIGMOID = new FullSynapse();
FullSynapse synapse_IHSINE = new FullSynapse();
FullSynapse synapse_IHGAUSS = new FullSynapse();
FullSynapse synapse_HSIGMOIDO = new FullSynapse();
FullSynapse synapse_HSINEO = new FullSynapse();
FullSynapse synapse_HGAUSSO = new FullSynapse();
input.addOutputSynapse(synapse_IHSIGMOID);
input.addOutputSynapse(synapse_IHSINE);
input.addOutputSynapse(synapse_IHGAUSS);
hiddenSigmoid.addInputSynapse(synapse_IHSIGMOID);
hiddenSine.addInputSynapse(synapse_IHSINE);
hiddenGauss.addInputSynapse(synapse_IHGAUSS);
hiddenSigmoid.addOutputSynapse(synapse_HSIGMOIDO);
hiddenSine.addOutputSynapse(synapse_HSINEO);
hiddenGauss.addOutputSynapse(synapse_HGAUSSO);
output.addInputSynapse(synapse_HSIGMOIDO);
output.addInputSynapse(synapse_HSINEO);
output.addInputSynapse(synapse_HGAUSSO);
// the input to the neural net
inputSynapse = new MemoryInputSynapse();
input.addInputSynapse(inputSynapse);
// the output of the neural net
outputSynapse = new MemoryOutputSynapse();
output.addOutputSynapse(outputSynapse);
// NEVER use an enabled xxxOutputSynapse when in training mode
outputSynapse.setEnabled(false);
// 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(hiddenSigmoid, NeuralNet.HIDDEN_LAYER);
nnet.addLayer(hiddenSine, NeuralNet.HIDDEN_LAYER);
nnet.addLayer(hiddenGauss, NeuralNet.HIDDEN_LAYER);
nnet.addLayer(output, NeuralNet.OUTPUT_LAYER);
nnet.setTeacher(trainer);
output.addOutputSynapse(trainer);
nakayama = new Nakayama(nnet);
nakayama.addLayer(hiddenSigmoid);
nakayama.addLayer(hiddenSine);
nakayama.addLayer(hiddenGauss);
// ErrorBasedConvergenceObserver myObserver = new ErrorBasedConvergenceObserver();
// myObserver.setPercentage(0.01);
// myObserver.addConvergenceListener(nakayama);
// nnet.addNeuralNetListener(myObserver);
DeltaBasedConvergenceObserver myObserver = new DeltaBasedConvergenceObserver();
myObserver.setSize(0.0005);
myObserver.setNeuralNet(nnet);
myObserver.addConvergenceListener(nakayama);
nnet.addNeuralNetListener(myObserver);
}
public void cicleTerminated(NeuralNetEvent e) {
}
public void errorChanged(NeuralNetEvent e) {
Monitor mon = (Monitor)e.getSource();
int c = mon.getTotCicles()-mon.getCurrentCicle();
if ((c % 100) == 0) {
System.out.println("Cycle: "+c+" (R)MSE:"+mon.getGlobalError());
}
// if(mon.getCurrentCicle() == 5000 || mon.getCurrentCicle() == 1000) {
// nakayama.optimize();
// }
}
public void netStarted(NeuralNetEvent e) {
}
public void netStopped(NeuralNetEvent e) {
test();
}
public void netStoppedError(NeuralNetEvent e, String error) {
}
}
Ads help maintain this website.