public BPResponse BP(BPRequest bpr) { Utility.Verify(() => bpr!=null,"BP bpr"); Stopwatch StopWatch=new Stopwatch(); StopWatch.Start(); bool trace=this.Inspector!=null; if(trace) Inspector.Trace("Backpropagation start, MaxEpochs={0}, MinEpochs={1}",bpr.MinEpochs.ToString(),bpr.MaxEpochs.ToString()); BPResponseEstimate estimate= BPResponseEstimate.Unknown; NeuronBase[] output=Structure.Output; List<BPEpochResponse> bper=new List<BPEpochResponse>(bpr.MaxEpochs); for(int i=0;i<bpr.MaxEpochs;i++) { bool succ=true; if(trace) Inspector.Trace("Backpropagation- start epoch {0}",(i+1).ToString()); TrainingData[] ts= bpr.GetTrainingData().ToArray(); List<double> errors=new List<double>(ts.Length); for(int j=0; j<ts.Length; j++){ bool testPass=true; if(ts[j].TestingSets!=null && ts[j].TestingSets.Any(x => GetPulseError(x,ts[j].Output)>bpr.MaxMSE)) testPass=false; double mse=GetPulseError(ts[j].Input,ts[j].Output); errors.Add(mse); if(mse>bpr.MaxMSE || !testPass) { for(var k=0;k!=output.Length;k++) ((Neuron)output[k]).BP(ts[j].Output[k]-output[k].LastOutputSignal,LearnFactor,Momentum); succ=false; } } double eps=GetTotalEps(errors.ToArray()); if(trace) Inspector.Trace("End of epoch {0}, total Eps={1}",(i+1).ToString(),eps); bper.Add(new BPEpochResponse(errors.ToArray(),eps)); if(i>=bpr.MinEpochs && succ) { estimate=BPResponseEstimate.Success; break; } if(i>=bpr.MaxEpochs-1){ if(!succ) estimate=BPResponseEstimate.Failure; break; } } StopWatch.Stop(); BPResponse response=new BPResponse(estimate,bper.ToArray(),StopWatch.Elapsed); return response; }
//util void StartLearning() { Stopped = false; Thread.CurrentThread.Priority = ThreadPriority.Lowest; Image[] bigimgs = Utility.Generate(i => Image.FromFile(@"mnist_train" + i.ToString() + ".jpg"), 10).ToArray(); int idx = 0, total = 0; List <TrainingData> trainingList = new List <TrainingData>(); foreach (double[] input in GetAllImages(bigimgs)) { if (Stopped) { return; } double[] output = Digitalizer.GetOutput(10, idx).ToArray(); Application.DoEvents(); trainingList.Add(new TrainingData(input, output)); GC.Collect(); GC.WaitForPendingFinalizers(); idx = (idx + 1) % 10; if (idx == 0) { total++; BPRequest request = new BPRequest(trainingList.ToArray(), 1) { ShuffleTrainingSet = true }; BPResponse response = Network.BP(request); double eps = response.Epochs[0].Epsilon; double ms = response.BPTime.TotalMilliseconds; trainingList.Clear(); } } StopLearning(); }
//util void StartLearning() { Stopped=false; button5.Text="Stop"; Log.Clear(); Thread.CurrentThread.Priority=ThreadPriority.Lowest; Image[] bigimgs=Utility.Generate(i => Image.FromFile(@"mnist_train"+i.ToString()+".jpg"),10).ToArray(); int idx=0,total=0; List<TrainingData> trainingList=new List<TrainingData>(); foreach(double[] input in GetAllImages(bigimgs)) { if(Stopped) return; double[] output=Digitalizer.GetOutput(10,idx).ToArray(); DrawDigitalized(input,LearnDigitBox); Application.DoEvents(); trainingList.Add(new TrainingData(input,output)); GC.Collect(); GC.WaitForPendingFinalizers(); idx= (idx+1)%10; if(idx==0) { total++; BPRequest request=new BPRequest(trainingList.ToArray(),1) { ShuffleTrainingSet=true }; BPResponse response= Network.BP(request); double eps=response.Epochs[0].Epsilon; double ms=response.BPTime.TotalMilliseconds; Log.Text+=string.Format("Process cycle {0}, error={1}, time[ms]={2}\r\n",total.ToString(),eps.ToString("0.000"),ms.ToString("0.000")); trainingList.Clear(); } } StopLearning(); }