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()); }
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); }
public void SetHiddenErrorValue(ITraversableUnitReadOnly <IUnitUnderTraining, IConnectionUnderTraining, IUnitActivationTraining> hiddenUnit, double error) { hiddenUnit.UnitActivation.Properties.Error = error; EventEmitter.Log(HiddenError, hiddenUnit.UnitActivation.Name, hiddenUnit.UnitActivation.Error); }
public void SetOutputErrorValue(ITraversableUnitReadOnly <IUnitUnderTraining, IConnectionUnderTraining, IUnitActivationTraining> outputUnit, double error) { outputUnit.UnitActivation.Properties.Error = error; EventEmitter.Log(OutputError, outputUnit.UnitActivation.Name, error); }
private static void ActivateUnit(ITraversableUnitReadOnly <IUnit, IConnection, IUnitActivation <IUnit> > traversableUnit) { traversableUnit.UnitActivation.Activate(); EventEmitter.Log(ActivationValue, traversableUnit.UnitActivation.Name, traversableUnit.UnitActivation.ActivationValue); }
private static void LoadNetInput(ITraversableUnitReadOnly <IUnit, IConnection, IUnitActivation <IUnit> > traversableUnit) { traversableUnit.LoadNetInput(); EventEmitter.Log(NetInput, traversableUnit.UnitActivation.Name, traversableUnit.UnitActivation.NetInput); }
private void InitializeWeight(IConnectionUnderTraining connectionUnderTraining) { _weightSetter.SetWeight(connectionUnderTraining); EventEmitter.Log(WeightInitialized, connectionUnderTraining.Name, connectionUnderTraining.Weight); }