Esempio n. 1
0
        //непосредственно обучение
        public double Train()                 //backpropagation method
        {
            var    temp_mses = new double[4]; //массив для хранения ошибок итераций
            double temp_cost = 0;             //текущее значение ошибки по эпохе

            do
            {
                int i = 0;
                foreach (var kvp in input_layer.TrainSet)
                {
                    //прямой проход
                    hidden_layer.Data = kvp.Key;
                    hidden_layer.Recognize(null, output_layer);
                    output_layer.Recognize(this, null);
                    //вычисление ошибки по итерации
                    var errors = new double[kvp.Value.Length];
                    for (var x = 0; x < errors.Length; ++x)
                    {
                        errors[x] = kvp.Value[x] - fact[x];
                    }
                    temp_mses[i] = GetMSE(errors);
                    //обратный проход и коррекция весов
                    double[] temp_gsums = output_layer.BackwardPass(errors);
                    hidden_layer.BackwardPass(temp_gsums);
                    i++;
                }

                temp_cost = GetCost(temp_mses); //вычисление ошибки по эпохе
                OnErrorChanged(temp_cost);

                //debugging
                WriteLine($"{temp_cost}");
            } while (temp_cost > Threshold);

            //загрузка скорректированных весов в "память"
            hidden_layer.WeightInitialize(MemoryMode.Set, nameof(hidden_layer));
            output_layer.WeightInitialize(MemoryMode.Set, nameof(output_layer));
            OnNetworkTrained();

            return(temp_cost);
        }