我正在按照《使用Encog C#》这本书中的指示进行操作,其中我不得不重新设计了一些代码以适应我的需求。
我正在处理图像数据集,每次将一个“类别”加载到网络中,训练它,保存它,然后在控制台程序中继续处理下一个“类别”。
这是我创建神经网络的方式:
public BasicNetwork CreateNetwork(ImageMLDataSet training) { var network = EncogUtility.SimpleFeedForward(training.InputSize, 100, 0, training.IdealSize, true); return network; }
以及我的训练集:imageDict是一个字典变量
public ImageMLDataSet CreateTraining() { var downsample = new RGBDownsample(); var training = new ImageMLDataSet(downsample, false, -1, 1); foreach (var item in imageDict) { ImageMLData data = new ImageMLData(item.Value); training.Add(data); } Console.WriteLine("训练集已创建"); return training; }
在此之后,我使用’ImagePair’为我的图像分配ID(在我的情况下使用的是字典而不是类),并将其处理为ImageMLData。
错误发生在这个方法中,当调用’EncogUtility.TrainConsole(train, network, training, minutes);’时。
public void TrainNetwork(BasicNetwork network, IMLDataSet training) { float minutes = 1; double strategyError = 0.25; int strategyCycles = 50; Console.WriteLine("训练开始..."); var train = new ResilientPropagation(network, training); try { train.AddStrategy(new ResetStrategy(strategyError, strategyCycles)); EncogUtility.TrainConsole(train, network, training, minutes); } catch(Exception e) { Console.WriteLine("错误发生在: " + e); } Console.WriteLine("训练停止"); }
当我运行这个程序时,我捕获到了以下异常:
错误发生在: Encog.EncogError: 嵌套异常 —> System.NullReferenceException: 对象引用未设置为对象的实例 在 Encog.MathUtil.Error.ErrorCalculation.UpdateError(Double[] actual, IMLData ideal, Double significance) ved Encog.Neural.Networks.Training.Propagation.GradientWorker.Process(IMLDataPair pair) at Encog.Neural.Networks.Training.Propagation.GradientWorker.Run() — 内部异常的堆栈跟踪结束 — at Encog.Neural.Networks.Training.Propagation.Propagation.Iteration()
at Encog.Util.Simple.EncogUtility.TrainConsole(IMLTrain train, BasicNetwork network, IMLDataSet trainingSet, Double seconds) at TreeSorting.NeuralNetwork.TrainNetwork(BasicNetwork network, IMLDataSet training) in C:\Dokumenter\Monosoft\Monosoft Project\ConsoleApp1\NeuralNetwork.cs:line 180
提前感谢 🙂
回答:
对于正在寻找此类问题解决方案的其他人:
我通过更改声明新变量时的’var’解决了这个问题,这似乎解决了我的问题。感谢@某人的回答解决了这个问题 c: