我正在使用Encog AI Framework进行使用HyperNEAT网络的时间序列预测。
以下是我用来创建网络的简单代码。
Substrate substrate = SubstrateFactory.factorSandwichSubstrate(columns*windowSize,days);
CalculateScore score = new TrainingSetScore(trainingSet);
NEATPopulation pop = new NEATPopulation(substrate, 500);
pop.setActivationCycles(4);
pop.reset();
EvolutionaryAlgorithm train = NEATUtil.constructNEATTrainer(pop, score);
OriginalNEATSpeciation speciation = new OriginalNEATSpeciation();
speciation.setCompatibilityThreshold(1);
train.setSpeciation(speciation = new OriginalNEATSpeciation());
System.out.println("Is HyperNEAT "+pop.isHyperNEAT());
// train the neural network
int epoch = 1;
do {
train.iteration();
if(writeOnStdOut)
System.out.println("Epoch #" + epoch + " Error:" + train.getError());
epoch++;
if(Math.abs(train.getError()-previousError)<0.000000001) iterationWithoutImprovement++; else iterationWithoutImprovement = 0;
previousError = train.getError();
Date dtemp = new Date();
} while(train.getError() > maximumAcceptedErrorTreshold && epoch < maxIterations && iterationWithoutImprovement < maxiter);
NEATGenome genome = (NEATGenome) pop.getBestGenome();
HyperNEATCODEC codec = new HyperNEATCODEC();
network2 = (NEATNetwork) codec.decode(pop, substrate, genome);
取自Box exampel https://github.com/encog/encog-java-examples/tree/master/src/main/java/org/encog/examples/neural/neat/boxes
其中columns是要素的数量,windowSize是预测未来值所需的前几天的数量(在我的示例中,windowSize为1)。
我得到了这个例外:
Exception in thread "pool-2-thread-416" java.lang.ArrayIndexOutOfBoundsException
at org.encog.util.EngineArray.arrayCopy(EngineArray.java:107)
at org.encog.neural.neat.NEATNetwork.compute(NEATNetwork.java:194)
at org.encog.util.error.CalculateRegressionError.calculateError(CalculateRegressionError.java:46)
at org.encog.neural.networks.training.TrainingSetScore.calculateScore(TrainingSetScore.java:61)
at org.encog.ml.ea.score.parallel.ParallelScoreTask.run(ParallelScoreTask.java:83)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
似乎处理线程存在问题。 有人可以帮我解决这个问题吗? 我的第二个问题是:如何在Encog中使用Backpropagation训练NEAT网络?
答案 0 :(得分:1)
关于数组越界异常。我查看了那一行,唯一可以导致它的是你发送的输入向量中包含的元素多于输入神经元的数量。我会确保您将神经网络定义为与您的数据最终成为相同的输入维度。
关于反向传播和NEAT / HyperNEAT,这不是这些网络的设计方式。至少Kenneth Stanley实施不起作用。这都是基因训练。可能有一种方法可以使用backprop微调NEAT网络,但我还没有尝试过。
答案 1 :(得分:0)
我宣布了这个
Substrate substrate = SubstrateFactory.factorSandwichSubstrate((int)Math.sqrt(NDataSetFeatures),1);
其中最后一个参数是Class,这适用于我。