static void Main(string[] args)
        {
            // Network initialize:
            ServiceCNNImages evaNetwork = new ServiceCNNImages();

            NetworkStructure netStructure = new NetworkStructure
            {
                InputVectorLength = 192,
                NeuronsByLayers   = new[] { 200, 200, 1 }
            };

            evaNetwork.CreateNetwork(netStructure, 3, "testDatasets.txt");

            // Main training:
            TrainConfiguration trainConfig = new TrainConfiguration
            {
                StartIteration        = 26000000,
                EndIteration          = 29110000,
                InputDatasetFilename  = "inputSets.txt",
                OutputDatasetFilename = "outputSets.txt",
                SourceFolderName      = "images",
                MemoryFolder          = ""
            };

            evaNetwork.Train(trainConfig, 3110000);

            // TODO: Temp
            DirectoryInfo dirInfo = new DirectoryInfo("testImages");

            double[] sssss = evaNetwork.Handle(dirInfo.GetFiles()[0].FullName);

            Console.ReadKey();
        }
        public void Train(TrainConfiguration trainConfiguration, int iterationToPause = 100)
        {
            if (_networkTeacher.CheckMemory(trainConfiguration.MemoryFolder))
            {
                _networkTeacher.TrainNets(trainConfiguration, iterationToPause);

                _networkTeacher.PrintLearnStatistic(trainConfiguration, true);

                if (_networkTeacher.CheckMemory(trainConfiguration.MemoryFolder))
                {
                    _networkTeacher.BackupMemory();
                }
            }
            else
            {
                Console.WriteLine("Train failed! Invalid memory!");
            }
        }
Example #3
0
        private List <TrainConfiguration> InitializeTrainConfigs(TrainConfiguration trainConfig, int iterationsToPause)
        {
            List <TrainConfiguration> trainConfigs = new List <TrainConfiguration>();

            int currentIterPosition = trainConfig.StartIteration;

            while (true)
            {
                if (trainConfig.EndIteration - currentIterPosition - 1 >= iterationsToPause)
                {
                    var trainConfigItem = new TrainConfiguration()
                    {
                        StartIteration        = currentIterPosition,
                        EndIteration          = currentIterPosition + iterationsToPause,
                        InputDatasetFilename  = trainConfig.InputDatasetFilename,
                        OutputDatasetFilename = trainConfig.OutputDatasetFilename
                    };

                    trainConfigs.Add(trainConfigItem);

                    currentIterPosition += iterationsToPause;
                }
                else
                {
                    var trainConfigItem = new TrainConfiguration()
                    {
                        StartIteration        = currentIterPosition,
                        EndIteration          = trainConfig.EndIteration,
                        InputDatasetFilename  = trainConfig.InputDatasetFilename,
                        OutputDatasetFilename = trainConfig.OutputDatasetFilename
                    };

                    trainConfigs.Add(trainConfigItem);

                    break;
                }
            }

            Console.WriteLine("Train configuration object created!");

            return(trainConfigs);
        }
Example #4
0
        public void CreateTrainSets(Extractor extractor, ImageLoader imageLoader, TrainConfiguration trainConfig)
        {
            Console.WriteLine("Start creating train sets...");

            List <double[]> inputDataSets  = new List <double[]>();
            List <double[]> outputDataSets = new List <double[]>();

            // Загрузка файлов из папки
            string[] outputClassesFolders = Directory.GetDirectories(trainConfig.SourceFolderName);

            for (int i = 0; i < outputClassesFolders.Length; i++)
            {
                // Получение информации о файлах в текущей папке:
                string[] fileInfo = Directory.GetFiles(outputClassesFolders[i]);

                for (int k = 0; k < fileInfo.Length; k++)
                {
                    // Создание входного вектора:
                    List <double[, ]> imageMatrix = imageLoader.LoadImageDataRGB(fileInfo[k]);
                    inputDataSets.Add(extractor.Extract(imageMatrix));

                    // Создание выходного вектора:
                    double[] outputVector = new double[outputClassesFolders.Length];
                    outputVector[i] = 1;
                    outputDataSets.Add(outputVector);
                }
            }

            Console.WriteLine("Creating completed!");
            Console.WriteLine("Saving train sets data...");

            //bool isEqual = Enumerable.SequenceEqual(inputDataSets[0], inputDataSets[1]);

            SaveSets(inputDataSets, outputDataSets, trainConfig.InputDatasetFilename, trainConfig.OutputDatasetFilename);

            Console.WriteLine("Save train sets completed!");
        }
Example #5
0
        /// <summary>
        /// Обучение сети
        /// </summary>
        /// <param name="startIteration"></param>
        /// <param name="withSort"></param>
        public void TrainNets(TrainConfiguration trainConfig, int iterationsToPause)
        {
            Iteration = trainConfig.EndIteration;

            // 1. Создание обучающих сетов из указанных папок:
            _fileManager.CreateTrainSets(_extractor, _imageLoader, trainConfig);

            #region Load data from file

            Console.WriteLine("Load train sets...");

            List <double[]> inputDataSets;
            List <double[]> outputDataSets;

            try
            {
                inputDataSets  = _fileManager.LoadSingleDataset(trainConfig.InputDatasetFilename);
                outputDataSets = _fileManager.LoadSingleDataset(trainConfig.OutputDatasetFilename);
            }
            catch (Exception ex)
            {
                _logger.LogError(ErrorType.SetMissing, ex);
                return;
            }

            #endregion

            Console.WriteLine("Training nets...");
            try
            {
                SingleNetworkTeacher[] netTeachers = new SingleNetworkTeacher[_netsList.Count];

                List <TrainConfiguration> trainConfigs = InitializeTrainConfigs(trainConfig, iterationsToPause);

                // Initialize teachers:
                for (int i = 0; i < netTeachers.Length; i++)
                {
                    netTeachers[i] = new SingleNetworkTeacher
                    {
                        Id                 = i,
                        Network            = _netsList[i],
                        TrainConfiguration = trainConfig,
                        InputDatasets      = inputDataSets,
                        OutputDatasets     = outputDataSets,
                        Logger             = _logger
                    };
                }

                List <Task> tasks;

                // Iteration multithreading train:
                for (int j = 0; j < trainConfigs.Count; j++)
                {
                    tasks = new List <Task>();

                    for (int i = 0; i < netTeachers.Length; i++)
                    {
                        var teacherNumber = i;
                        var task          = Task.Run(() => { netTeachers[teacherNumber].Train(); });
                        tasks.Add(task);
                    }
                    ;

                    Task.WaitAll(tasks.ToArray());

                    if (j != trainConfigs.Count - 1)
                    {
                        Console.WriteLine("Iterations already finished: " + iterationsToPause * (j + 1));
                    }
                    else
                    {
                        Console.WriteLine("Iterations already finished: " + trainConfig.EndIteration);
                    }

                    CommonTestColorized();
                }

                Console.WriteLine("Training success!");
            }
            catch (Exception ex)
            {
                _logger.LogError(ErrorType.TrainError, ex);
            }
        }
Example #6
0
        public void PrintLearnStatistic(TrainConfiguration trainConfig, bool withLogging = false)
        {
            Console.WriteLine("Start calculating statistic...");

            int testPassed = 0;
            int testFailed = 0;
            int testFailed_lowActivationCause = 0;

            #region Load data from file

            List <double[]> inputDataSets;
            List <double[]> outputDataSets;

            try
            {
                inputDataSets  = _fileManager.LoadSingleDataset(trainConfig.InputDatasetFilename);
                outputDataSets = _fileManager.LoadSingleDataset(trainConfig.OutputDatasetFilename);
            }
            catch (Exception ex)
            {
                _logger.LogError(ErrorType.SetMissing, ex);
                return;
            }

            #endregion

            for (int i = 0; i < inputDataSets.Count; i++)
            {
                List <double> netResults = new List <double>();

                for (int k = 0; k < _netsList.Count; k++)
                {
                    // Получение ответа:
                    netResults.Add(_netsList[k].Handle(inputDataSets[i])[0]);
                }

                // Поиск максимально активирующейся сети (класса) с заданным порогом активации:
                int maxIndex = FindMaxIndex(netResults, 0.8);

                if (maxIndex == -1)
                {
                    testFailed++;
                    testFailed_lowActivationCause++;
                }
                else
                {
                    if (outputDataSets[i][maxIndex] != 1)
                    {
                        testFailed++;
                    }
                    else
                    {
                        testPassed++;
                    }
                }
            }

            // Logging (optional):
            if (withLogging)
            {
                _logger.LogTrainResults(testPassed, testFailed, testFailed_lowActivationCause, Iteration);
            }

            Console.WriteLine("Test passed: {0}\nTest failed: {1}\n     - Low activation causes: {2}\nPercent learned: {3:f2}", testPassed,
                              testFailed,
                              testFailed_lowActivationCause,
                              (double)testPassed * 100 / (testPassed + testFailed));
        }