Пример #1
0
        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();
        }