Exemplo n.º 1
0
        /// <summary>
        /// Обучает сеть входному вектору, с учетом желаемого выходного вектора.
        /// Обучение происходит методом обратного распространения ошибки
        /// </summary>
        /// <param name="inputImage"></param>
        /// <param name="targetOutput"></param>
        public void Train(double[][] inputImage, double[] targetOutput)
        {
            Debug.AssertEqualSize(inputImage, InputImageWidth, InputImageHeight);
            Debug.Assert(targetOutput.Length == OutputLayer.Neurons.Length);

            // прогоняем картинку через сеть
            PropagateForward(inputImage);

            // подсчет mse
            var output = GetOutputVector();
            var mse    = ArrayMath.CalculateMSE(output, targetOutput);

            // если она не мала, то обучаем сеть обратным распространением
            if (mse > 0.1 * TrainingInfo.EpochMSE)
            {
                PropagateBack(targetOutput);
            }

            // обновляем статистику
            TrainingInfo.PushMeanSquaredError(mse);
            TrainingInfo.IncrementBackPropagationsCount();
        }
Exemplo n.º 2
0
        private void TestProcess(NormalizedImage[] images)
        {
            for (_imageProcessed = 0; _imageProcessed < images.Length; _imageProcessed++)
            {
                var desiredOutput = ArrayHelper <double> .CreateScalar(10, -1.0, images[_imageProcessed].Label.Value, 1.0);

                var output = _network.Calculate(images[_imageProcessed].RawData);

                var answer = ArrayMath.MaxValueIndex(output);
                var mse    = ArrayMath.CalculateMSE(output, desiredOutput);

                if (answer != images[_imageProcessed].Label)
                {
                    _errors.Push(_imageProcessed);
                }
                _totalMSE += mse;

                if (_cancelTrainToken.IsCancellationRequested)
                {
                    break;
                }
            }
        }