0

HyperNEAT ネットワークを使用した時系列予測に Encog AI フレームワークを使用しています。

ネットワークを作成するために使用する簡単なコードを次に示します。

                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);     

ボックスの例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)

スレッドの処理に問題があるようです。誰かがこの問題を解決するのを手伝ってくれますか? 2 番目の質問は、Encog でバックプロパゲーションを使用して NEAT ネットワークをトレーニングするにはどうすればよいですか?

4

2 に答える 2

1

範囲外の配列の例外について。私はその行を見ましたが、それを引き起こす可能性のある唯一のことは、入力ニューロンを持っているよりも多くの要素を持つ入力ベクトルを送信していることです. 最終的にデータが最終的になるのと同じ入力次元になるようにニューラル ネットワークを定義していることを確認します。

バックプロパゲーションと NEAT/HyperNEAT に関しては、これらのネットワークがトレーニングされるように設計されているわけではありません。少なくとも Kenneth Stanley の実装は機能しません。それはすべて遺伝的訓練です。backprop を使用して NEAT ネットワークを微調整する方法があるかもしれませんが、試したことはありません。

于 2014-12-15T01:25:52.893 に答える
0

私はこう宣言しました

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

最後のパラメーターはクラスで、これは私にとってはうまくいきます。

于 2015-07-03T13:34:59.263 に答える