示例#1
0
        public static double TotalError(NeuralNetwork net, TrainingSet trainingSamples)
        {
            var netOutputs           = trainingSamples.Select(x => net.ForwardPass(x.Input));
            var expectedOutpus       = trainingSamples.Select(x => x.Ideal);
            var trainingSampleErrors = expectedOutpus.Zip(netOutputs, TrainingSampleError);

            return(trainingSampleErrors.Sum() / trainingSamples.Count);
        }
        private static void PerformTrainingEpoch(NeuralNetwork net, TrainingConfiguration config, TrainingSet trainingSet)
        {
            trainingSet.ForEach(sample =>
            {
                var netOutput                = net.ForwardPass(sample.Input);
                var outputDeltas             = netOutput.Zip(sample.Ideal, (actual, ideal) => OutputDelta(ideal, actual)).ToList();
                var outputWeightsAdjustments = outputDeltas
                                               .Select(d => net.HiddenLayer.Select(h => h.LastOutput).Select(h => OutputWeightDelta(d, h)));

                var outputDeltaPairs        = net.OutputLayer.Zip(outputDeltas, (output, oDelta) => new { output, oDelta });
                var outputWeightedDeltaSums = net.HiddenLayer
                                              .Select((_, idx) => outputDeltaPairs
                                                      .Select(outputDeltaPair => outputDeltaPair.output.Weights[idx] * outputDeltaPair.oDelta)
                                                      .Sum());

                var hiddenDeltaPairs = net.HiddenLayer.Select(h => h.LastOutput)
                                       .Zip(outputWeightedDeltaSums, (h, delta) => new { HiddenOutput = h, Delta = delta });

                var hiddenWeightsAdjustments =
                    hiddenDeltaPairs.Select(hd => sample.Input.Select(i => HiddenWeightDelta(hd.Delta, hd.HiddenOutput, i)));

                UpdateWeights(outputWeightsAdjustments, hiddenWeightsAdjustments, net, config);
            });
        }