static void Main(string[] args) { Console.OutputEncoding = Encoding.UTF8; Console.WriteLine(@"Загрузка данных для обучения и проверки..."); Frame <int, string> training = DataService.GetTrainingData(); Frame <int, string> validation = DataService.GetValidationData(500); Console.WriteLine(@"Проводится нормализация пикселей..."); NormalizePixels(training); NormalizePixels(validation); Console.WriteLine(@"Кодирование цифр в обучающей и проверочной выборках..."); EncodeDigit(training); EncodeDigit(validation); // Инициализация нейронной сети ActivationNetwork network = new ActivationNetwork( new SigmoidFunction(), // сигмоидная активационная функция InputNeuronsCount, // количество входных нейронов (784) FirstHiddenLayerNeuronsCount, // количество нейронов в первом скрытом слое (100) SecondHiddenLayerNeuronsCount, // количество нейронов во втором скрытом слое (100) OutputNeuronsCount); // количество нейронов в выходном слое (10) // Данный класс отвечает за реализацию алгоритма обратного распространения ошибки BackPropagationLearning learner = new BackPropagationLearning(network) { LearningRate = 0.1 // Начальная скорость обучения }; // Производим инициализацию весов сети при помощи распределения Гаусса new GaussianWeights(network).Randomize(); List <double> errors = new List <double>(); List <double> validationErrors = new List <double>(); double[][] features = training.Columns[FeatureColumns].ToArray2D <double>().ToJagged(); double[][] labels = training.Columns[LabelColumns].ToArray2D <double>().ToJagged(); Console.WriteLine($@"Запущен процесс обучения нейронной сети, количество эпох: {EpochCount}..."); for (int i = 0; i < EpochCount; i++) { double error = learner.RunEpoch(features, labels) / labels.GetLength(0); errors.Add(error); // сохраняем ошибку для построения графика // Обучаем сеть методом обратного распространения ошибки // и, для каждой эпохи, получаем ошибку обучения double validationError = NetworkValidationService .Validate(network, // Нейронная сеть validation, // данные для тестирования labels); // колонки с данными // сохраняем квадратичную ошибку для построения графика validationErrors.Add(validationError); Console.WriteLine($@"{DateTime.Now} Эпоха: {i}, Ошибка обучения: {error}, Ошибка тестирования: {validationError}"); } PlotService.PlotValidationCurve(validationErrors, EpochCount); PlotService.PlotTrainingCurve(errors, EpochCount); PrintValidationReport(network, NetworkValidationService, training); Console.Write("Сохраняем состояние обученной сети на диск... "); DataService.SaveNetworkState(network); Console.ReadKey(); }