0

我正在使用 Encog AI 框架使用 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 示例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 中使用反向传播训练 NEAT 网络?

4

2 回答 2

1

至于数组越界异常。我查看了那条线,唯一可能导致它的原因是您发送的输入向量具有比输入神经元更多的元素。我会确保您将神经网络定义为与最终数据相同的输入维度。

至于反向传播和 NEAT/HyperNEAT,这不是这些网络被设计用来训练的方式。至少 Kenneth Stanley 的实现不起作用。这都是基因训练。可能有一种方法可以使用反向传播微调 NEAT 网络,但我还没有尝试过。

于 2014-12-15T01:25:52.893 回答
0

我已经宣布了

Substrate substrate = SubstrateFactory.factorSandwichSubstrate((int)Math.sqrt(NDataSetFeatures),1);

最后一个参数是类,这对我有用。

于 2015-07-03T13:34:59.263 回答