/*
* TimeSeriesForecasting.java
*
* Created on 10 giugno 2005, 21.31
*/
package org.joone.samples.engine.timeseries;
import java.io.File;
import org.joone.engine.DelayLayer;
import org.joone.engine.FullSynapse;
import org.joone.engine.Layer;
import org.joone.engine.Monitor;
import org.joone.engine.NeuralNetListener;
import org.joone.engine.SigmoidLayer;
import org.joone.engine.Synapse;
import org.joone.engine.TanhLayer;
import org.joone.engine.learning.TeachingSynapse;
import org.joone.io.FileInputSynapse;
import org.joone.io.FileOutputSynapse;
import org.joone.net.NeuralNet;
/**
*
* @author paolo
*/
public class TimeSeriesForecasting implements NeuralNetListener {
static String path = "org/joone/samples/engine/timeseries/";
static String fileName = path+"timeseries.txt";
int trainingPatterns = 300;
int epochs = 1000;
int temporalWindow = 10;
DelayLayer input;
SigmoidLayer hidden;
TanhLayer output;
TeachingSynapse trainer;
NeuralNet nnet;
/** Creates a new instance of TimeSeriesForecasting */
public TimeSeriesForecasting() {
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
TimeSeriesForecasting me = new TimeSeriesForecasting();
me.createNet();
System.out.println("Training...");
me.train();
me.interrogate(path+"results1.txt");
me.interrogate(path+"results2.txt");
System.out.println("Done.");
}
private void createNet() {
input = new DelayLayer();
hidden = new SigmoidLayer();
output = new TanhLayer();
input.setTaps(temporalWindow-1);
input.setRows(1);
hidden.setRows(15);
output.setRows(1);
connect(input, new FullSynapse(), hidden);
connect(hidden, new FullSynapse(), output);
input.addInputSynapse(createDataSet(fileName, 1, trainingPatterns, "1"));
trainer = new TeachingSynapse();
trainer.setDesired(createDataSet(fileName, 2, trainingPatterns+1, "1"));
output.addOutputSynapse(trainer);
nnet = new NeuralNet();
nnet.addLayer(input, NeuralNet.INPUT_LAYER);
nnet.addLayer(hidden, NeuralNet.HIDDEN_LAYER);
nnet.addLayer(output, NeuralNet.OUTPUT_LAYER);
}
private void train() {
Monitor mon = nnet.getMonitor();
mon.setLearningRate(0.2);
mon.setMomentum(0.7);
mon.setTrainingPatterns(trainingPatterns);
mon.setTotCicles(epochs);
mon.setPreLearning(temporalWindow);
mon.setLearning(true);
mon.addNeuralNetListener(this);
nnet.start();
mon.Go();
nnet.join();
}
private void interrogate(String outputFile) {
Monitor mon = nnet.getMonitor();
input.removeAllInputs();
int startRow = trainingPatterns - temporalWindow;
input.addInputSynapse(createDataSet(fileName, startRow+1, startRow+20, "1"));
output.removeAllOutputs();
FileOutputSynapse fOutput = new FileOutputSynapse();
fOutput.setFileName(outputFile);
output.addOutputSynapse(fOutput);
mon.setTrainingPatterns(20);
mon.setTotCicles(1);
mon.setLearning(false);
nnet.start();
mon.Go();
nnet.join();
}
private void connect(Layer layer1, Synapse syn, Layer layer2) {
layer1.addOutputSynapse(syn);
layer2.addInputSynapse(syn);
}
private FileInputSynapse createDataSet(String fileName, int firstRow, int lastRow, String advColSel) {
FileInputSynapse fInput = new FileInputSynapse();
fInput.setInputFile(new File(fileName));
fInput.setFirstRow(firstRow);
fInput.setLastRow(lastRow);
fInput.setAdvancedColumnSelector(advColSel);
return fInput;
}
public void cicleTerminated(org.joone.engine.NeuralNetEvent e) {
Monitor mon = (Monitor)e.getSource();
int epoch = mon.getTotCicles() - mon.getCurrentCicle();
if ((epoch > 0) && ((epoch % 100) == 0)) {
System.out.println("Epoch:"+epoch+" RMSE="+mon.getGlobalError());
}
}
public void errorChanged(org.joone.engine.NeuralNetEvent e) {
}
public void netStarted(org.joone.engine.NeuralNetEvent e) {
}
public void netStopped(org.joone.engine.NeuralNetEvent e) {
Monitor mon = (Monitor)e.getSource();
if (mon.isLearning()) {
int epoch = mon.getTotCicles() - mon.getCurrentCicle();
System.out.println("Epoch:"+epoch+" last RMSE="+mon.getGlobalError());
}
}
public void netStoppedError(org.joone.engine.NeuralNetEvent e, String error) {
}
}
Ads help maintain this website.