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