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); }); }