Пример #1
0
        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));
        }
Пример #2
0
        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)));
        }
Пример #3
0
        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));
        }