Ejemplo n.º 1
0
        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));
            }
        }
Ejemplo n.º 2
0
 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;
             }
         }
     }
 }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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));
        }