Closed
Description
As I wrote here http://www.heatonresearch.com/comment/6404#comment-6404, recurrent freeform networks are broken.
There are many ways to reproduce the problem, here I took the "ElmanXOR" example and I tried to convert the Elman network to a freeform Elman network (applying minimal changes).
public class ElmanXOR {
// *** USE THE FreeformNetwork.createElman() METHOD ***
/*static BasicNetwork createElmanNetwork() {
// construct an Elman type network
ElmanPattern pattern = new ElmanPattern();
pattern.setActivationFunction(new ActivationSigmoid());
pattern.setInputNeurons(1);
pattern.addHiddenLayer(6);
pattern.setOutputNeurons(1);
return (BasicNetwork)pattern.generate();
}*/
static BasicNetwork createFeedforwardNetwork() {
// construct a feedforward type network
FeedForwardPattern pattern = new FeedForwardPattern();
pattern.setActivationFunction(new ActivationSigmoid());
pattern.setInputNeurons(1);
pattern.addHiddenLayer(6);
pattern.setOutputNeurons(1);
return (BasicNetwork)pattern.generate();
}
public static void main(final String args[]) {
final TemporalXOR temp = new TemporalXOR();
final MLDataSet trainingSet = temp.generate(120);
//final BasicNetwork elmanNetwork = ElmanXOR.createElmanNetwork();
// *** USE THE FreeformNetwork.createElman() METHOD ***
final FreeformNetwork elmanNetwork = FreeformNetwork.createElman(1, 6, 1, new ActivationSigmoid());
final BasicNetwork feedforwardNetwork = ElmanXOR
.createFeedforwardNetwork();
//final double elmanError = ElmanXOR.trainNetwork("Elman", elmanNetwork,
// trainingSet);
// *** USE THE EncogUtility.trainToError() METHOD ***
EncogUtility.trainToError(elmanNetwork, trainingSet, 0.000001);
final double feedforwardError = ElmanXOR.trainNetwork("Feedforward",
feedforwardNetwork, trainingSet);
//System.out.println("Best error rate with Elman Network: " + elmanError);
System.out.println("Best error rate with Feedforward Network: "
+ feedforwardError);
System.out
.println("Elman should be able to get into the 10% range,\nfeedforward should not go below 25%.\nThe recurrent Elment net can learn better in this case.");
System.out
.println("If your results are not as good, try rerunning, or perhaps training longer.");
Encog.getInstance().shutdown();
}
public static double trainNetwork(final String what,
final BasicNetwork network, final MLDataSet trainingSet) {
// train the neural network
CalculateScore score = new TrainingSetScore(trainingSet);
final MLTrain trainAlt = new NeuralSimulatedAnnealing(
network, score, 10, 2, 100);
final MLTrain trainMain = new Backpropagation(network, trainingSet,0.000001, 0.0);
final StopTrainingStrategy stop = new StopTrainingStrategy();
trainMain.addStrategy(new Greedy());
trainMain.addStrategy(new HybridStrategy(trainAlt));
trainMain.addStrategy(stop);
int epoch = 0;
while (!stop.shouldStop()) {
trainMain.iteration();
System.out.println("Training " + what + ", Epoch #" + epoch
+ " Error:" + trainMain.getError());
epoch++;
}
return trainMain.getError();
}
}
What I always get is a NullPointerException when I try to train the network.
Thanks.
Metadata
Metadata
Assignees
Labels
No labels