Пример #1
0
        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;
        }
Пример #2
0
        //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();
        }
Пример #3
0
        //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();
        }