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!"); } }
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); }
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!"); }
/// <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); } }
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)); }