0

次のビットで配列エラーを生成するように見える次のコードがあります。

int run = 0;

    while(myNet.RunNet(q) > 0.2 && run < 1000) {

        myNet.TrainNet(templates, 10);
        run += 1;

    }

ポイントは、ループ外のテンプレートでTrainNetを実行すると、同じエラーが返されないことです... :S

public void SetInput(ArrayList<Double> inputs) {

    ArrayList<Neuron> inputNeurons = networkLayers.get(0).getLayerNeurons();

    for(int i = 0; i < inputNeurons.size(); i++) {

        inputNeurons.get(i).ResetInput();
        inputNeurons.get(i).ReceiveInput(inputs.get(i));

    }

}

どちらが返されますか

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at NeuralNet.Network.SetInput(Network.java:82)
at NeuralNet.Network.TrainNet(Network.java:100)
at nnTest.RunNet.main(RunNet.java:90)

為に:

ArrayList<Double> m = new ArrayList<Double>();
    m.add(0.0);
    m.add(0.0);
    m.add(0.0);

    ArrayList<Double> n = new ArrayList<Double>();
    n.add(1.0);
    n.add(1.0);
    n.add(0.0);

    ArrayList<Double> o = new ArrayList<Double>();
    o.add(1.0);
    o.add(0.0);
    o.add(1.0);

    ArrayList<Double> p = new ArrayList<Double>();
    p.add(1.0);
    p.add(1.0);
    p.add(1.0);

    ArrayList<ArrayList<Double>> templates = new ArrayList<ArrayList<Double>>();
    templates.add(m);
    templates.add(n);
    templates.add(o);
    templates.add(p);

解析済み

public void TrainNet(ArrayList<ArrayList<Double>> templates, int epochs) {


    int j = 1;

    for(ArrayList<Double> currentTemplate : templates) {
        System.out.println("------------------------");
        System.out.println("Testing through set " + j);
        j += 1;

        outputNeuron.setDesired(currentTemplate.get(0));
        currentTemplate.remove(0);
        SetInput(currentTemplate);

        for(int i = 0; i < epochs; i++) {

            FeedForward();
            BackPropagate();


        }

    }

}

public void SetInput(ArrayList<Double> inputs) {

    ArrayList<Neuron> inputNeurons = networkLayers.get(0).getLayerNeurons();

    for(int i = 0; i < inputNeurons.size(); i++) {

        inputNeurons.get(i).ResetInput();
        inputNeurons.get(i).ReceiveInput(inputs.get(i));

    }

}

助言がありますか?:)

4

4 に答える 4

1
inputNeurons.get(i).ReceiveInput(inputs.get(i));

では、に少なくとも と同じ数のエントリinputs.get(i)があると想定しています。おそらくそうではないので、その範囲を超えています。inputsinputNeurons

于 2013-06-19T17:21:44.920 に答える
0

ここに:

inputNeurons.get(i).ReceiveInput(inputs.get(i));

iが の範囲内にあることを確認するために何もしていませんinputs

少なくとも、エラー メッセージには次の場所が表示されます。

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at NeuralNet.Network.SetInput(Network.java:82)
at NeuralNet.Network.TrainNet(Network.java:100)
at nnTest.RunNet.main(RunNet.java:90)

java.lang.IndexOutOfBoundsExceptionスローされ、そこから発せられ、コードjava.util.ArrayList.rangeCheck問題のある行番号で完了しました。行を見てください。上で強調した行です。それが、この種の問題をデバッグする方法です。java.util.ArrayList.getNeuralNet.Network.SetInput8282

また、デバッガーをアタッチして、そのような支援を受けてバグを処理する方法を自分で訓練することをお勧めします。

于 2013-06-19T17:22:24.000 に答える
0

あなたの問題は、次のステートメントにあるようです。

inputNeurons.get(i).ReceiveInput(inputs.get(i));

i は、入力の範囲を超えてしまう可能性があります。

于 2013-06-19T17:23:24.557 に答える
-1

ループ条件を次のように変更してみてください

i < inputNeurons.size() - 1

以下の例のように?

for(int i = 0; i<inputNeurons.size() - 1; i++) {
    inputNeurons.get(i).ResetInput();
    inputNeurons.get(i).ReceiveInput(inputs.get(i));
}
于 2013-06-19T17:26:16.210 に答える