private static Epoch Teach([NotNull] this INetworkTeacher Teacher, [NotNull, ItemNotNull] IEnumerable <Example> Examples) { var outputs_count = Teacher.Network.OutputsCount; var examples = Examples as Example[] ?? Examples.ToArray(); var results = new TeachResult[examples.Length]; var max_error = 0d; var avg_error = 0d; var output = new double[outputs_count]; for (var i = 0; i < examples.Length; i++) { var example = examples[i]; var example_input = example.Input; var example_expected_output = example.ExpectedOutput; var error = Teacher.Teach(example_input, output, example_expected_output); if (error > max_error) { max_error = error; } avg_error += error; if (double.IsNaN(error)) { throw new InvalidOperationException("Ошибка сети является \"не числом\" - возможно сеть нестабвльна."); } if (double.IsInfinity(error)) { throw new InvalidOperationException("Ошибка сети является \"бесконечностью\" - возможно сеть нестабильна."); } results[i] = new TeachResult(example, output, error); } return(new Epoch(results, max_error, avg_error / examples.Length)); }
public static Epoch TeachRandom( [NotNull] this INetworkTeacher Teacher, [NotNull, ItemNotNull] Example[] Examples, [CanBeNull] Random rnd = null) { if (Teacher is null) { throw new ArgumentNullException(nameof(Teacher)); } if (Examples is null) { throw new ArgumentNullException(nameof(Examples)); } return(Teacher.Teach(Examples.AsRandomEnumerable(rnd))); }
public static Epoch Teach([NotNull] this INetworkTeacher Teacher, [NotNull, ItemNotNull] params Example[] Examples) { if (Teacher is null) { throw new ArgumentNullException(nameof(Teacher)); } if (Examples is null) { throw new ArgumentNullException(nameof(Examples)); } if (Teacher.Network.InputsCount == 0) { throw new InvalidOperationException("Сеть не имеет входов"); } if (Teacher.Network.OutputsCount == 0) { throw new InvalidOperationException("Сеть не имеет выходов"); } var inputs_count = Teacher.Network.InputsCount; var outputs_count = Teacher.Network.OutputsCount; for (var i = 0; i < Examples.Length; i++) { var example = Examples[i]; // ReSharper disable once ConditionIsAlwaysTrueOrFalse if (example is null) { // ReSharper disable once HeuristicUnreachableCode throw new InvalidOperationException($"Обучающий пример с индексом {i} отсутствует"); } if (example.Input.Length != inputs_count) { throw new InvalidOperationException($"Длина входного вектора примера №{i} ({example.Input.Length}) не равна количеству входов сети ({inputs_count})"); } if (example.ExpectedOutput.Length != outputs_count) { throw new InvalidOperationException($"Длина вектора ожидаемого результата №{i} ({example.ExpectedOutput.Length}) не равна количеству выходов сети ({outputs_count})"); } } return(Teach(Teacher, (IEnumerable <Example>)Examples)); }