/// <summary> /// Главный метод нейросети - обучение на картинках 28x28 pixels /// </summary> public void Learn(DataNumberDTO_28x28_Set[] dataSet) { // Поэтапная тренировка по каждой картинке for (var i = 0; i < dataSet.Length; i++) { var rightAnswer = dataSet[i].Number; var neural3NetworkHelper = new Neural3NetworkHelper(Neural3NetworkCreator); // Трансформирование RGB - компонент в входной сигнал для нейронов входного слоя var RGBComponents = dataSet[i].RGBComponents; var signalsFromInputLayer = neural3NetworkHelper.TransformWhiteBlackPixelsToSignals(RGBComponents); var inputLayer = Neural3NetworkCreator.InputLayer; var hiddenLayer = Neural3NetworkCreator.HiddenLayer; var outputLayer = Neural3NetworkCreator.OutputLayer; var inputHiddenRelations = neural3NetworkHelper.GetInputHiddenRelations(); var hiddenOutputRelations = neural3NetworkHelper.GetHiddenOutputRelations(); // Вычисление комбинированного и сглаженного сигнала, пропущенного через сигмоиду, // данный сигнал прошел через все узлы и вышел из output layer var signalsFromHiddenLayer = neural3NetworkHelper.CalcSignalsFromLayer(signalsFromInputLayer, inputLayer, hiddenLayer, inputHiddenRelations, _funcActivation); var signalsFromOutputLayer = neural3NetworkHelper.CalcSignalsFromLayer(signalsFromHiddenLayer, hiddenLayer, outputLayer, hiddenOutputRelations, _funcActivation); var neural3NetworkWeightsUpdater = new Neural3NetworkWeightsUpdater(this, signalsFromInputLayer, signalsFromHiddenLayer, signalsFromOutputLayer); // Обновление весов на нужных ребрах, в зависимости от ошибки и правильного ответа var errorsHiddenLayer = neural3NetworkWeightsUpdater.UpdateWeights(hiddenOutputRelations, signalsFromHiddenLayer, signalsFromOutputLayer, rightAnswer); neural3NetworkWeightsUpdater.UpdateWeights(errorsHiddenLayer, inputHiddenRelations, signalsFromInputLayer, signalsFromHiddenLayer); } }
/// <summary> /// Главный метод нейросети - обучение на картинках 28x28 pixels /// </summary> public OutputSignalDTO Check(DataNumberDTO_28x28_Set imageDataSet, out double[] signalsFromInputLayer, out double[] signalsFromHiddenLayer, out double[] signalsFromOutputLayer) { var rightAnswer = imageDataSet.Number; var neural3NetworkHelper = new Neural3NetworkHelper(_neural3NetworkCreator); // Трансформирование RGB - компонент в входной сигнал для нейронов входного слоя var RGBComponents = imageDataSet.RGBComponents; signalsFromInputLayer = neural3NetworkHelper.TransformWhiteBlackPixelsToSignals(RGBComponents); var inputLayer = _neural3NetworkCreator.InputLayer; var hiddenLayer = _neural3NetworkCreator.HiddenLayer; var outputLayer = _neural3NetworkCreator.OutputLayer; var inputHiddenRelations = neural3NetworkHelper.GetInputHiddenRelations(); var hiddenOutputRelations = neural3NetworkHelper.GetHiddenOutputRelations(); // Вычисление комбинированного и сглаженного сигнала, пропущенного через сигмоиду, // данный сигнал прошел через все узлы и вышел из output layer signalsFromHiddenLayer = neural3NetworkHelper.CalcSignalsFromLayer(signalsFromInputLayer, inputLayer, hiddenLayer, inputHiddenRelations, _funcActivation); signalsFromOutputLayer = neural3NetworkHelper.CalcSignalsFromLayer(signalsFromHiddenLayer, hiddenLayer, outputLayer, hiddenOutputRelations, _funcActivation); return(neural3NetworkHelper.GetOutputSignalDTO(signalsFromOutputLayer)); }