public static void Training(Network network, DataSet.DataSet data, Optimizer.Optimizer optimizer = null, float limitError = 1e-5f, bool printLog = false) { var error = float.MaxValue; var it = 0; var usedOptimizer = optimizer?.Clone() ?? DefaultOptimizer.Clone(); usedOptimizer.LearningRate /= data.TrainingDataSize; network.SetOptimizer(usedOptimizer); while (error > limitError) { if (printLog) { WriteLine($"Epoch {it++}"); } error = 0.0f; network.ClearDeltaW(); foreach (var datum in data.TrainingData()) { network.SetInputs(datum.Input); network.ForwardPropagation(); error += network.Error(datum.Output); network.BackPropagation(datum.Output); } network.UpdateWeights(); error /= data.TrainingDataSize; if (printLog) { WriteLine($"Error : {error: ##0.00000;-##0.00000}"); } } network.FinishLearning(); }