public void Mutate(Func <float, int, int, float> func)
 {
     WeightsInputHidden.Map(func);
     WeightsHiddenOutput.Map(func);
     BiasHidden.Map(func);
     BiasOutput.Map(func);
 }
        public void Train(float[] inputArray, float[] targetArray)
        {
            var inputs = Matrix.FromArray(inputArray);
            var hidden = Matrix.Multiply(WeightsInputHidden, inputs);

            hidden.Add(BiasHidden);
            hidden.Map(_activationFunction.Func);

            var outputs = Matrix.Multiply(WeightsHiddenOutput, hidden);

            outputs.Add(BiasOutput);
            outputs.Map(_activationFunction.Func);

            var targets      = Matrix.FromArray(targetArray);
            var outputErrors = Matrix.Subtract(targets, outputs);

            var gradients = Matrix.Map(outputs, _activationFunction.Dfunc);

            gradients.Multiply(outputErrors);
            gradients.Multiply(_learningRate);

            var hiddenTranspose           = Matrix.Transpose(hidden);
            var weightsHiddenOutputDeltas = Matrix.Multiply(gradients, hiddenTranspose);

            // Adjust the weights by deltas
            WeightsHiddenOutput.Add(weightsHiddenOutputDeltas);
            // Adjust the bias by its deltas (which is just the gradients)
            BiasOutput.Add(gradients);

            // Calculate the hidden layer errors
            var weightsHiddenOutputTranspose = Matrix.Transpose(WeightsHiddenOutput);
            var hiddenErrors = Matrix.Multiply(weightsHiddenOutputTranspose, outputErrors);

            // Calculate hidden gradient
            var hiddenGradient = Matrix.Map(hidden, _activationFunction.Dfunc);

            hiddenGradient.Multiply(hiddenErrors);
            hiddenGradient.Multiply(_learningRate);

            // Calcuate input->hidden deltas
            var inputsTranspose         = Matrix.Transpose(inputs);
            var weightInputHiddenDeltas = Matrix.Multiply(hiddenGradient, inputsTranspose);

            WeightsInputHidden.Add(weightInputHiddenDeltas);
            // Adjust the bias by its deltas (which is just the gradients)
            BiasHidden.Add(hiddenGradient);
        }
        public void Save(string file)
        {
            using (var fs = File.OpenWrite(file))
            {
                using (var bw = new BinaryWriter(fs))
                {
                    bw.Write(Epoch);

                    bw.Write(InputNodes);
                    bw.Write(HiddenNodes);
                    bw.Write(OutputNodes);

                    WeightsInputHidden.Save(bw);
                    WeightsHiddenOutput.Save(bw);
                    BiasHidden.Save(bw);
                    BiasOutput.Save(bw);
                    bw.Write(_learningRate);
                }
            }
        }
Exemplo n.º 4
0
        public void Mutate(double probability, double standardDeviation)
        {
            if (Playfield.RNG.NextDouble() < probability)
            {
                WeightsInputToHidden = WeightsInputToHidden.Add(RandomGaussian(0, standardDeviation));
            }
            if (Playfield.RNG.NextDouble() < probability)
            {
                WeightsHiddenToOutput = WeightsHiddenToOutput.Add(RandomGaussian(0, standardDeviation));
            }
            if (Playfield.RNG.NextDouble() < probability)
            {
                BiasHidden = BiasHidden.Add(RandomGaussian(0, standardDeviation));
            }
            if (Playfield.RNG.NextDouble() < probability)
            {
                BiasOutput = BiasOutput.Add(RandomGaussian(0, standardDeviation));
            }

            UpdateVisualization();
        }
Exemplo n.º 5
0
        ///**************** PRIVATE *******************////

        private void InitBias()
        {
            //Randomize bias
            BiasHidden.Random();
            BiasOutput.Random();
        }