public void Train(List <double[]> inputs, List <double[]> expectedOutputs, int batchlength, double dropOutRate = .27) { int i = 0; int batchI = 0; List <double[]> toPropagate, expectedToPropagate = new List <double[]>(); toPropagate = new List <double[]>(); double lastCost = 0; do { if (toPropagate.Count >= batchlength) { NetworkValues gradients = BackPropagationBatch(toPropagate, expectedToPropagate, out double currentCost, dropOutRate); ApplyGradients(gradients, Math.Abs(lastCost - currentCost)); lastCost = currentCost; toPropagate = expectedToPropagate = new List <double[]>(); Console.WriteLine($"Epoch {batchI} finished!\tCurrent cost = {currentCost}"); batchI++; } else { toPropagate.Add(inputs[i]); expectedToPropagate.Add(expectedOutputs[i]); i++; } }while (i < inputs.Count); if (toPropagate.Count > 0) { NetworkValues gradients = BackPropagationBatch(toPropagate, expectedToPropagate, out double currentCost, dropOutRate); ApplyGradients(gradients, Math.Abs(lastCost - currentCost)); } }
internal void ApplyGradients(NetworkValues gradients, double learningRate = 1.5) { for (int layerIndex = 0; layerIndex < layers.Count; layerIndex++) { for (int neuronIndex = 0; neuronIndex < layers[layerIndex].length; neuronIndex++) { for (int weigthIndex = 0; weigthIndex < layers[layerIndex].neurons[neuronIndex].Weigths.Count; weigthIndex++) { layers[layerIndex].neurons[neuronIndex].Weigths[weigthIndex] -= gradients[layerIndex].neurons[neuronIndex].weigths[weigthIndex] * learningRate; } } } }
public NetworkValues BackPropagationBatch(List <double[]> inputs, List <double[]> expectedOutputs, out double averageCost, double dropOutRate = .27) { double currentCost; averageCost = 0; NetworkValues networkValues = BackPropagate(inputs[0], expectedOutputs[0], out currentCost); averageCost += currentCost; for (int i = 1; i < inputs.Count; i++) { networkValues += BackPropagate(inputs[i], expectedOutputs[i], out currentCost, dropOutRate); averageCost += currentCost; } averageCost /= inputs.Count; return(networkValues); }
public void Train(double[] input, double[] expectedOutput, double dropOutRate, double lastCost, out double currentCost) { NetworkValues gradients = BackPropagate(input, expectedOutput, out currentCost, dropOutRate); ApplyGradients(gradients, Math.Abs(lastCost - currentCost)); }