예제 #1
0
        public async Task <IPerceptron <IUnit, IConnection, IUnitActivation <IUnit> > > TrainAsync(IEnumerable <TrainingPattern> trainingPatterns, double errorMax, int maxEpochs = 0)
        {
            CheckErrorMax(errorMax);
            CheckMaxEpochs(maxEpochs);

            await _errorBackPropagationSteps.RunInitialization();

            double netError;
            var    epochs = 0;

            do
            {
                netError = 0;
                foreach (var trainingPattern in trainingPatterns)
                {
                    EventEmitter.Log(Training, TrainingIdealValues, trainingPattern.IdealActivations);
                    EventEmitter.Log(Training, TrainingInputs, trainingPattern.InputValues);

                    var actualValues = await _errorBackPropagationSteps.FeedInputs(trainingPattern.InputValues);

                    netError += _networkErrorFunction.Calculate(trainingPattern.IdealActivations, actualValues);
                    EventEmitter.Log(NetError, NetError, netError);

                    EventEmitter.Log(Training, Training, RunningFeedback);
                    await _errorBackPropagationSteps.RunFeedbackPhaseAsync(trainingPattern.IdealActivations);

                    EventEmitter.Log(Training, Training, RanFeedback);
                }
                _errorBackPropagationSteps.CompleteRun();
            }while (Math.Abs(netError) > errorMax && (maxEpochs < 1 || ++epochs < maxEpochs));

            return(_errorBackPropagationSteps.GetPerceptron());
        }
예제 #2
0
        private void UpdateConnectionWeight(ITraversableConnection <IUnitUnderTraining, IConnectionUnderTraining, IUnitActivationTraining> connection)
        {
            var weightChange         = _calculator.CalculateChange(connection.InputUnit.ActivationValue, connection.OutputUnit.UnitActivation.Error);
            var momentumWeightChange = connection.Properties.LastWeightChange * _momentum;

            _weightChangeApplier.ApplyWeightChange(connection.Properties, weightChange + momentumWeightChange);
            EventEmitter.Log(WeightChange, connection.Properties.Name, connection.Properties.Weight);
        }
예제 #3
0
 public void SetHiddenErrorValue(ITraversableUnitReadOnly <IUnitUnderTraining, IConnectionUnderTraining, IUnitActivationTraining> hiddenUnit, double error)
 {
     hiddenUnit.UnitActivation.Properties.Error = error;
     EventEmitter.Log(HiddenError, hiddenUnit.UnitActivation.Name, hiddenUnit.UnitActivation.Error);
 }
예제 #4
0
 public void SetOutputErrorValue(ITraversableUnitReadOnly <IUnitUnderTraining, IConnectionUnderTraining, IUnitActivationTraining> outputUnit, double error)
 {
     outputUnit.UnitActivation.Properties.Error = error;
     EventEmitter.Log(OutputError, outputUnit.UnitActivation.Name, error);
 }
예제 #5
0
 private static void ActivateUnit(ITraversableUnitReadOnly <IUnit, IConnection, IUnitActivation <IUnit> > traversableUnit)
 {
     traversableUnit.UnitActivation.Activate();
     EventEmitter.Log(ActivationValue, traversableUnit.UnitActivation.Name, traversableUnit.UnitActivation.ActivationValue);
 }
예제 #6
0
 private static void LoadNetInput(ITraversableUnitReadOnly <IUnit, IConnection, IUnitActivation <IUnit> > traversableUnit)
 {
     traversableUnit.LoadNetInput();
     EventEmitter.Log(NetInput, traversableUnit.UnitActivation.Name, traversableUnit.UnitActivation.NetInput);
 }
예제 #7
0
 private void InitializeWeight(IConnectionUnderTraining connectionUnderTraining)
 {
     _weightSetter.SetWeight(connectionUnderTraining);
     EventEmitter.Log(WeightInitialized, connectionUnderTraining.Name, connectionUnderTraining.Weight);
 }