Exemple #1
0
 public UsersController(MausrDb db)
 {
     this.db = db;
 }
Exemple #2
0
 public SymbolDrawingsController(MausrDb db, AppSettingsProvider appSettingsProvider)
 {
     this.db = db;
     this.appSettingsProvider = appSettingsProvider;
 }
Exemple #3
0
 public SymbolsController(MausrDb db)
 {
     this.db = db;
 }
Exemple #4
0
 public TrainController(MausrDb db, TrainStorageManager trainStorageManager, CurrentEvaluator evaluator)
 {
     this.db = db;
     this.trainStorageManager = trainStorageManager;
     this.evaluator           = evaluator;
 }
Exemple #5
0
 public TeachController(MausrDb db, CurrentEvaluator evaluator)
 {
     this.db        = db;
     this.evaluator = evaluator;
 }
Exemple #6
0
 public HomeController(MausrDb db, CurrentEvaluator evaluator, ICaptcha captcha)
 {
     this.db        = db;
     this.evaluator = evaluator;
     this.captcha   = captcha;
 }
Exemple #7
0
        public void TrainNetwork()
        {
            stopwatch.Reset();
            stopwatch.Start();

            sendMessage("Loading training settings.");
            trainSettings = storageManager.LoadTrainSettings(netId);
            if (trainSettings == null)
            {
                sendMessage("Train settings file was not found.");
                return;
            }

            using (var db = MausrDb.Create()) {
                sendMessage("Initializing learning environment.");
                trainData = new TrainData();

                int inputSize  = trainSettings.InputImgSizePx * trainSettings.InputImgSizePx;
                int outputSize = db.Symbols.Count();

                var layout = new NetLayout(inputSize, trainSettings.HiddenLayersSizes, outputSize);
                network = new Net(layout, new SigomidActivationFunc(), new NetCostFunction());
                network.SetOutputMap(db.Symbols.Select(s => s.SymbolId).ToArray());
                netEvaluator = new NetEvaluator(network);


                var optimizer = createOptimizer(trainSettings);
                var trainer   = new NetTrainer(network, optimizer, trainSettings.RegularizationLambda);

                unpackedCoefs = network.Layout.AllocateCoefMatrices();

                sendMessage("Preparing inputs and outputs.");
                prepareInOut(db);

                sendMessage(string.Format("Learning of {0} samples started.", trainInputs.RowCount));
                bool converged = trainer.TrainBatch(trainInputs, trainSettings.BatchSize, trainSettings.LearnRounds,
                                                    trainOutIds, trainSettings.InitSeed, trainSettings.MinDerivCompMaxMagn, trainIterationCallback, job.CancellationToken);

                if (job.CancellationToken.IsCancellationRequested)
                {
                    sendMessage("Training {0}.", job.Canceled ? "canceled" : "stopped");
                }
                else
                {
                    sendMessage("Training done ({0}converged).", converged ? "" : "not ");
                }

                if (!job.Canceled)
                {
                    sendMessage("Saving trained data.");
                    if (!storageManager.SaveNet(netId, network))
                    {
                        sendMessage("Failed to save the network.");
                    }

                    if (!storageManager.SaveTrainData(netId, trainData))
                    {
                        sendMessage("Failed to save training data.");
                    }

                    sendMessage("Saving results visualization.");
                    if (!createAndSaveResultsVis(3, 0.01, 40))
                    {
                        sendMessage("Failed visualize results.");
                    }
                }

                stopwatch.Stop();
            }

            sendMessage("All done.");
        }
Exemple #8
0
        private void prepareInOut(MausrDb db)
        {
            var ic       = new NetInputConvertor();
            var dbInputs = db.SymbolDrawings.Where(x => x.Approved == true).ToList();

            var baseInputsAndDrawings = dbInputs
                                        .Select(sd => new { SymbolId = sd.Symbol.SymbolId, RawDrawing = sd.GetRawDrawing() })
                                        .ToList();

            var inputsAndDrawings = baseInputsAndDrawings.ToList();
            var dataProc          = new RawDataProcessor();

            if (trainSettings.GenerateExtraInputsByRotation != 0)
            {
                inputsAndDrawings.AddRange(baseInputsAndDrawings
                                           .Select(x => new {
                    SymbolId   = x.SymbolId,
                    RawDrawing = dataProc.Rotate(x.RawDrawing, trainSettings.GenerateExtraInputsByRotation)
                }));
                inputsAndDrawings.AddRange(baseInputsAndDrawings
                                           .Select(x => new {
                    SymbolId   = x.SymbolId,
                    RawDrawing = dataProc.Rotate(x.RawDrawing, -trainSettings.GenerateExtraInputsByRotation)
                }));
            }

            if (trainSettings.NormalizeInput)
            {
                foreach (var iad in inputsAndDrawings)
                {
                    dataProc.NormalizeInPlace(iad.RawDrawing);
                }
            }

            ic.Shuffle(inputsAndDrawings);

            var rasterizer = new Rasterizer()
            {
                ImageSize   = trainSettings.InputImgSizePx,
                DrawPoints  = false,
                ExtraMargin = true,
                PenSizePerc = trainSettings.PenThicknessPerc / 100f
            };

            int testSamplesCount = 1 + (trainSettings.TestDataSetSizePerc * inputsAndDrawings.Count / 100);
            {
                var testSet      = inputsAndDrawings.Take(testSamplesCount).ToList();
                var testDrawings = testSet.Select(x => x.RawDrawing).ToList();

                testInputs           = ic.CreateInputsMatrix(testDrawings, rasterizer, false);
                testOutIds           = testSet.Select(x => x.SymbolId).ToArray();
                testOutNeuronIndices = ic.CreateOutIndicesFromIds(testOutIds, network);
            }
            {
                var trainSet      = inputsAndDrawings.Skip(testSamplesCount).ToList();
                var trainDrawings = trainSet.Select(x => x.RawDrawing).ToList();

                trainInputs           = ic.CreateInputsMatrix(trainDrawings, rasterizer, false);
                trainOutIds           = trainSet.Select(x => x.SymbolId).ToArray();
                trainOutNeuronIndices = ic.CreateOutIndicesFromIds(trainOutIds, network);
            }
        }