我正在尝试使用 Neuroph 库训练神经网络,但出现此错误:
44 [NeurophLearningThread] INFO org.neuroph.core.learning.LearningRule - Learning Started
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1028)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at org.neuroph.util.NeurophArrayList.writeObject(NeurophArrayList.java:710)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
问题是,我使用相同的代码在另一个项目中训练神经网络,该项目具有相同的导入jar并且工作正常。以下是我用于创建和训练 NN 的代码:
public void TrainNeuralNetwork(double[] inputs, double[] outputs){
DataSet set = new DataSet(inputs.length,outputs.length);
set.addRow(inputs,outputs);
System.out.println("Training...");
MultiLayerPerceptron loadSnakeNN = new MultiLayerPerceptron(TransferFunctionType.LINEAR, inputs.length, 500, outputs.length);
if( loadSnakeNN.getLearningRule() instanceof MomentumBackpropagation )
((MomentumBackpropagation)loadSnakeNN.getLearningRule()).setBatchMode(true);
MomentumBackpropagation learningRule = (MomentumBackpropagation)loadSnakeNN.getLearningRule();// Set learningRule
learningRule.setMaxError(0.01);
loadSnakeNN.learn(set);
loadSnakeNN.save("SnakeNN.nnet");
System.out.println("Neural Network Trained!");
}
更新
我找到了问题所在。当我使用超过 90 个输入时,出现上述错误。所以我的新问题是,如何训练这个超过90个输入的神经网络?
您可以使用 JVM 参数 -Xss
来增加程序可用的堆栈大小。
`java -Xss2048m ...`
意味着你会得到一堆2048Mb
.如果从 IDE 运行此功能,则可以搜索以了解如何为特定 IDE 传递 JVM 参数。
我假设您的代码或库中都没有错误,否则增加堆栈可能还不够。