Esempio n. 1
0
        public void Run(int firstHiddenLayerSize, int secondHiddenLayerSize, int iterations, float learningRate, int batchSize)
        {
            var digitReader = new HandwrittenDigitReader();

            var trainDigits = digitReader.Iterate(
                MnistFiles.FindByType(MNISTFileType.TrainImages).FileName,
                MnistFiles.FindByType(MNISTFileType.TrainLabels).FileName);

            var testDigits = digitReader.Iterate(
                MnistFiles.FindByType(MNISTFileType.TestImages).FileName,
                MnistFiles.FindByType(MNISTFileType.TestLabels).FileName);

            var trainingData = trainDigits.Select(im => im.ToDataPoint());
            var testData     = testDigits.Select(im => im.ToDataPoint());

            var cancellationToken = new CancellationTokenSource();

            _model = new PerceptronModel(
                HandwrittenDigit.ImageSize * HandwrittenDigit.ImageSize,
                firstHiddenLayerSize,
                secondHiddenLayerSize,
                10);

            _classifier = new PerceptronClassifier(
                _model,
                learningRate,
                batchSize);


            var watch = Stopwatch.StartNew();

            _classifier.IterationComplete += j =>
            {
                //Console.WriteLine($"Epoch {j}: {MNISTEvaulate(net, testData)} / {testData.Count}");
                OnLog(
                    $"Iteration #{j} has completed: {EvaluateClassifier(_classifier, testData)} / {testData.Count()} [{watch.ElapsedMilliseconds} ms]");
                watch = Stopwatch.StartNew();

                if (j == iterations)
                {
                    cancellationToken.Cancel();
                }

                EpochComplete?.Invoke(j);
            };

            _classifier.Train(trainingData, cancellationToken.Token);
        }
Esempio n. 2
0
        public void EndEpoch(double trainingError)
        {
            _timer.Stop();
            var delta = trainingError - LastTrainingError;

            LastTrainingError = trainingError;
            _trainingErrorDelta.Push(delta);

            EpochComplete?.Invoke(this);

            float trainingRate;

            if (_scheduledTrainingRate.TryGetValue(CurrentEpoch, out trainingRate))
            {
                TrainingRate = trainingRate;
                Console.WriteLine("Training rate changed to " + trainingRate);
            }
        }