我有以下代码,似乎在以下位上生成数组错误:
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 :(得分:1)
inputNeurons.get(i).ReceiveInput(inputs.get(i));
使用inputs.get(i)
,您假设inputs
的条目数至少与inputNeurons
一样多。它可能不会超出它的范围。
答案 1 :(得分: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.get
NeuralNet.Network.SetInput
来自82
的您的代码,其中包含违规行号{{1 }}。看一下82
行。这是我上面强调的那条线。这就是你调试这些问题的方法。
另外,我鼓励你训练自己附加一个调试器并在这样的帮助下解决bug。
答案 2 :(得分:0)
你的问题似乎在于这句话:
inputNeurons.get(i).ReceiveInput(inputs.get(i));
我可能会超出输入范围。
答案 3 :(得分:-1)
尝试将循环条件更改为
我&lt; inputNeurons.size() - 1
如下例所示?
for(int i = 0; i<inputNeurons.size() - 1; i++) {
inputNeurons.get(i).ResetInput();
inputNeurons.get(i).ReceiveInput(inputs.get(i));
}