Exemplo n.º 1
0
        public List <double> SGDTrain(
            int epochs,
            double learningRate,
            int batchSize,
            double lossEps,
            string[] filesPath,
            int[] inputResults,
            int classCount,
            CancellationToken cancellation)
        {
            var toReturn = new List <double>();

            var inputDataCount = filesPath.Length;

            for (int i = 0; i < epochs; ++i)
            {
                var batchCount = Convert.ToInt32(inputDataCount / batchSize);

                var loss   = 0.0;
                var losses = new List <double>();
                var outputLayerGradient = new double[Perceptron.OutputLayer.NeuronsCount];
                var inputResult         = new double[classCount];

                for (int j = 0; j < inputResults.Length; ++j)
                {
                    inputResult = PrepareInputResult(inputResults[j], classCount);

                    var input = ImageProcessingHelper.PrepareData(filesPath[j]);

                    loss = SGDStep(learningRate, input, inputResult);

                    Console.WriteLine($"Epoch - {i}, step - {j}, loss - {loss}");

                    toReturn.Add(Math.Abs(loss));
                    if (Math.Abs(loss) < lossEps)
                    {
                        break;
                    }

                    if (cancellation.IsCancellationRequested)
                    {
                        break;
                    }
                }
            }

            return(toReturn);
        }
Exemplo n.º 2
0
        public List <double> SGDTrainFromDir(
            int epochs,
            double learningRate,
            double lossEps,
            string[] filesPath,
            int[] inputResults,
            int classCount)
        {
            var toReturn = new List <double>();

            var inputDataCount = filesPath.Length;

            for (int i = 0; i < epochs; ++i)
            {
                for (int j = 0; j < inputDataCount; ++j)
                {
                    var inputResult = PrepareInputResult(inputResults[j], classCount);

                    var input = ImageProcessingHelper.PrepareData(filesPath[j]);

                    var loss = SGDStep(learningRate, input, inputResult);

                    var results = Perceptron.OutputLayer.OutputNonMatrix.ToList();

                    Console.WriteLine($"Epoch - {i}, step - {j}, loss - {loss}, prediction - {results.IndexOf(results.Max())}, actual result - {Array.IndexOf(inputResult, inputResult.Max())}");

                    toReturn.Add(Math.Abs(loss));
                    if (Math.Abs(loss) < lossEps)
                    {
                        break;
                    }
                }
            }

            return(toReturn);
        }
Exemplo n.º 3
0
        public Tuple <List <double>, List <double> > MiniBatchSGD(
            int epochs,
            double learningRate,
            int batchSize,
            double lossEps,
            string[] filesPath,
            int[] inputResults,
            int classCount,
            CancellationToken cancellation)
        {
            Console.WriteLine("MINI-BATCH");

            var toReturn   = new List <double>();
            var toReturnAc = new List <double>();

            var countPrec = 0;

            var inputDataCount = filesPath.Length;

            for (int i = 0; i < epochs; ++i)
            {
                var batchCount = Convert.ToInt32(inputDataCount / batchSize);

                for (int j = 0; j < batchCount; j++)
                {
                    var loss   = 0.0;
                    var losses = new List <double>();

                    var accuracy     = 0.0;
                    var accuracyList = new List <double>();

                    var outputLayerGradient = new double[Perceptron.OutputLayer.NeuronsCount];
                    var inputResult         = new double[classCount];

                    for (int k = 0; k < batchSize; k++)
                    {
                        inputResult = PrepareInputResult(inputResults[k + j * batchSize], classCount);

                        List <double[][]> input = new List <double[][]>();
                        try
                        {
                            input = ImageProcessingHelper.PrepareData(filesPath[k + j * batchSize]);
                        }
                        catch (Exception ex)
                        {
                            continue;
                        }

                        var stepResults = FeedForwardStep(learningRate, input, inputResult);
                        losses.Add(stepResults.Item1);
                        accuracyList.Add(stepResults.Item2);

                        outputLayerGradient.Add(Perceptron.GetOutputLayerGradient(inputResult));
                    }

                    outputLayerGradient.ForEach(item => item = item / batchSize);

                    BackwardStep(outputLayerGradient, learningRate, inputResult);

                    loss     = losses.Sum() / losses.Count;
                    accuracy = accuracyList.Sum() / accuracyList.Count;

                    Console.WriteLine($"Epoch - {i}, step - {j}, loss - {loss}, accuracy - {accuracy}");

                    toReturn.Add(Math.Abs(loss));
                    toReturnAc.Add(Math.Abs(accuracy));

                    if (Math.Abs(loss) < lossEps)
                    {
                        break;
                    }

                    if (cancellation.IsCancellationRequested)
                    {
                        break;
                    }
                }
            }

            return(new Tuple <List <double>, List <double> >(toReturn, toReturnAc));
        }