2013-06-19 3 views
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)); 

    } 

} 

Любые предложения? :)

+0

проверки входа в – Prasanth

+0

я предлагаю вам пройти через код в ваш отладчик и вы, вероятно, чтобы увидеть, что размер двух коллекций вы доступа не то же самое. –

+0

i является brianestey

ответ

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

С inputs.get(i), вы предполагаем, что inputs имеет, по крайней мере, столько записей, сколько inputNeurons. Вероятно, это не так, что вы превышаете его границы.

+0

Ну, да, но если я запустил myNet.TrainNet (шаблоны, 10); вне цикла, то он не дает ту же ошибку ... – MrD

0

Прямо здесь:

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

Вы ничего не сделали для того, чтобы i в оценках inputs.

На Minimun, сообщение об ошибке сказал вам, где искать:

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.get из NeuralNet.Network.SetInput, который ваш код в комплекте с обижая номер строки 82. Посмотрите на строку 82. Это линия, которую я выделил выше. Вот как вы отлаживаете такие проблемы.

Кроме того, я призываю вас приучить себя к отладчику и работать с ошибками при помощи таких.

0

Вашей проблема, кажется, лежа в этом заявлении:

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

я могу работать вне границ для входов.

-1

иметь ваш попытался изменить свое состояние цикла в

< я inputNeurons.size() - 1

как в приведенном ниже примере? Длина

for(int i = 0; i<inputNeurons.size() - 1; i++) { 
    inputNeurons.get(i).ResetInput(); 
    inputNeurons.get(i).ReceiveInput(inputs.get(i)); 
} 
Смежные вопросы