public UsersController(MausrDb db) { this.db = db; }
public SymbolDrawingsController(MausrDb db, AppSettingsProvider appSettingsProvider) { this.db = db; this.appSettingsProvider = appSettingsProvider; }
public SymbolsController(MausrDb db) { this.db = db; }
public TrainController(MausrDb db, TrainStorageManager trainStorageManager, CurrentEvaluator evaluator) { this.db = db; this.trainStorageManager = trainStorageManager; this.evaluator = evaluator; }
public TeachController(MausrDb db, CurrentEvaluator evaluator) { this.db = db; this.evaluator = evaluator; }
public HomeController(MausrDb db, CurrentEvaluator evaluator, ICaptcha captcha) { this.db = db; this.evaluator = evaluator; this.captcha = captcha; }
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."); }
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); } }